2015-04-21 7 views
0

У меня есть 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' } 
+0

Каким может быть решение? Вы закрываете соединение. Клиент предупреждает вас о том, что соединение было закрыто. Что еще там? Повторите отправку запроса. – Brad

+0

Почему у вас может быть тайм-аут на стороне сервера, для которого задано значение, меньшее, чем некоторые из ваших запросов. Тайм-аут на стороне сервера должен быть установлен дольше, чем ожидалось, чтобы завершить запрос. – jfriend00

+0

@ jfriend00 это тайм-аут между запросами, каждый запрос занимает мало времени для обработки. – calibr

ответ

0

Я думаю, что там это только одно решение для этого - отправьте запрос, если получен ECONNRESET, я нашел хороший lib, который обертывает такую ​​логику https://github.com/FGRibreau/node-request-retry

 Смежные вопросы

  • Нет связанных вопросов^_^