У меня есть HTTP-сервер Node.js, который закрывает входящие соединения, если их простаивает в течение 10 секунд, и клиент, который использует пул соединений Keep-Alive для запроса этого сервера. Когда я начинаю отправлять запросы с интервалом 10 секунд, я периодически получаю сообщения об ошибках ECONNRESET, я думаю, потому что соединение закрывается в середине HTTP-запроса. Есть ли элегантное решение, кроме простого запроса на повторный запрос?Node.JS, сервер закрывает соединение Keep-Alive в середине запроса
server.js
var server = require('http').createServer(function(req, res) {
console.log(new Date(), "Request ", req.method);
res.end("Nice");
});
server.timeout = 10000;
server.on("connection", function(socket) {
console.log("New connection");
socket._created = new Date().getTime();
socket.on("close", function() {
var now = new Date().getTime();
console.log(new Date(), "Socket closed, TTL", (now - socket._created)/1000);
});
});
server.listen(3000);
client.js
var http = require("http");
var agent = new http.Agent({
keepAlive: true
});
var reqSent = 0;
var NEED_REQS = 10;
var TIMEOUT = 10000;
function _req() {
var start = new Date().getTime();
var req = http.get({
host: "localhost",
port: 3000,
agent: agent
}, function(res) {
reqSent++;
var now = new Date().getTime();
console.log("Sent:", reqSent, (now - start)/1000);
if(reqSent >= NEED_REQS) {
agent.destroy();
return;
}
res.setEncoding('utf8');
res.on('data', function (chunk) {
});
setTimeout(function() {
_req();
}, TIMEOUT);
});
req.on("error", function(err) {
console.error(err);
});
}
_req();
Запуск client.js
$ node client.js
Sent: 1 0.028
Sent: 2 0.008
Sent: 3 0.002
{ [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
Каким может быть решение? Вы закрываете соединение. Клиент предупреждает вас о том, что соединение было закрыто. Что еще там? Повторите отправку запроса. – Brad
Почему у вас может быть тайм-аут на стороне сервера, для которого задано значение, меньшее, чем некоторые из ваших запросов. Тайм-аут на стороне сервера должен быть установлен дольше, чем ожидалось, чтобы завершить запрос. – jfriend00
@ jfriend00 это тайм-аут между запросами, каждый запрос занимает мало времени для обработки. – calibr