(PERL -> NODEJS) 500: сервер закрыл соединение без отправки данных обратно - PullRequest
2 голосов
/ 20 июня 2020
Сценарий

My Perl обращается к серверу Node.js и отправляет команды, которые сервер Node.js должен выполнить. Некоторые команды занимают меньше времени, другие - намного дольше. Пока команда выполняется на сервере, соединение молчит. Через некоторое время я получаю error: 500: Server closed connection without sending any data back

. Во время этой ошибки команда все еще выполняется на сервере, и желаемые результаты получены (если вы проверите журналы сервера). Моя проблема в том, что я не хочу, чтобы соединение сбрасывалось, поскольку есть другие команды, которые нужно запускать после этих длительных команд. Некоторые команды могут занять 20 минут.

Perl Боковой код:

my $ua = LWP::UserAgent->new;

$ua->timeout(12000);    
my $uri = URI->new('http://server');
my $json = JSON->new;
my $data_to_json = {DATA};
my $json_content = $json->encode($data_to_json);    
# set custom HTTP request header fields
my $req = HTTP::Request->new(POST => $uri);
my $resp = $ua->request($req);
my $message = $resp->decoded_content;

NodeJS Код

var express = require('express');
var http = require('http');
var app = express();
app.use(express.json());
var port = process.env.PORT || 8080;

app.get('<API URL>', function (req, res) {
    <get all the passed arguments>
    <send output to the console>
});

app.post('<API URL>', function(req, res) {

    .
    .
    .
    req.connection.setTimeout(0);
    var exec = require('child_process').exec;
    var child = exec(command);
    }

// start the server
const server = app.listen(port);
server.timeout = 12000;
console.log('Server started! Listening on port' + port);

Я попытался добавить тайм-аут для сервера используя server.timeout и req.connection.setTimeout(0);.

Как убедиться, что соединение не разорвано?

1 Ответ

4 голосов
/ 21 июня 2020

Как правило, заставлять веб-воркера выполнять длительные задачи - плохая идея. Это связывает воркера, и у вас возникают такие проблемы.

Вместо этого пусть веб-воркер добавляет задание в какую-то очередь заданий (Perl s Minion действительно отлично). Очередь работает независимо от веб-сервера. Клиенты могут опрашивать сервер, чтобы проверить состояние задания и получить выходные данные или артефакты, когда оно будет завершено.

Еще одним преимуществом правильной очереди заданий является то, что вы можете перезапустить задания в случае их сбоя. Очередь знает, что задание было. Как вы видели, разорванное веб-соединение означает, что оно не работает, и вы, вероятно, потеряли эти входные данные.

...