2015-01-30 23 views
7

Próbuję skonfigurować klienta HTTP, aby utrzymać podstawowe połączenie otwarte (keep-alive) w pliku node.js, ale wygląda na to, że zachowanie nie jest zgodne z dokumentami (http://nodejs.org/api/http.html#http_class_http_agent).HTTP keep-alive w pliku node.js

Tworzę nowego agenta HTTP, ustawiając właściwość maxSockets na 1 i żądając adresu URL (na przykład http://www.twilio.com/) na sekundę.

Wygląda na to, że na każde żądanie gniazdo jest zamykane i tworzone jest nowe gniazdo. Testowałem to z node.js 0.10.25 i 0.10.36 pod Ubuntu 14.04.

Czy ktoś był w stanie utrzymać się przy życiu?

Oto kod:

var http = require("http"); 

var agent = new http.Agent(); 
agent.maxSockets = 1; 

var sockets = []; 

function request(hostname, path, callback) { 
    var options = { 
     hostname: hostname, 
     path: path, 
     agent: agent, 
     headers: {"Connection": "keep-alive"} 
    }; 
    var req = http.get(options, function(res) { 
     res.setEncoding('utf8'); 
     var body = ""; 
     res.on('data', function (chunk) { 
      body += chunk; 
     }); 
     res.on('end', function() { 
      callback(null, res, body); 
     }); 
    }); 
    req.on('error', function(e) { 
     return callback(error); 
    }); 
    req.on("socket", function (socket) { 
     if (sockets.indexOf(socket) === -1) { 
      console.log("new socket created"); 
      sockets.push(socket); 
      socket.on("close", function() { 
       console.log("socket has been closed"); 
      }); 
     } 
    }); 
} 

function run() { 
    request('www.twilio.com', '/', function (error, res, body) { 
     setTimeout(run, 1000); 
    }); 
} 

run(); 
+0

Co zawiera 'console.dir (res.headers.connection)' w twoim wywołaniu zwrotnym 'http.get()'? – mscdex

+0

Już to sprawdziłem, a host odbiera w odpowiedzi odpowiedź "Połączenie: keep-alive", co oznacza, że ​​akceptuje on pozostawienie otwartego połączenia. – quentinadam

Odpowiedz

0

Chyba to powinno działać na węźle 0.12+. W tym celu możesz również użyć innego agenta. Na przykład keep-alive-agent może robić to, co chcesz:

var KeepAliveAgent = require('keep-alive-agent'), 
    agent = new KeepAliveAgent(); 
2

Jeśli się nie mylę pula połączenie zostało zrealizowane w 0,12.

Więc jeśli chcesz mieć puli połączeń przed 0.12 można po prostu użyć modułu request:

var request = require('request') 
request.get('www.twilio.com', {forever: true}, function (err, res, body) {}); 

Jeśli używasz węzeł 0.12+ i chcesz korzystać z modułu podstawowego HTTP bezpośrednio, wtedy można to wykorzystać, aby zainicjować agenta:

var agent = new http.Agent({ 
    keepAlive: true, 
    maxSockets: 1, 
    keepAliveMsecs: 3000 
}) 

Zawiadomienie własnością keepAlive: true, czyli wymagane utrzymać gniazdo otwarte.

Możesz również przekazać agenta do modułu request, który działa tylko w wersji 0.12+, w przeciwnym razie domyślnie implementuje pulę wewnętrzną.

+0

Oczywiście, w momencie mojego posta, najnowsza stabilna wersja Node.js miała rozmiar 0.10, a dokumenty, do których się przyłączyłem, zawierały dokumentację 0.10. Dzięki za odpowiedź, spróbuję, gdy dostanę szansę (w międzyczasie wdrożyłem obejście). – quentinadam

+0

Nie zauważyłem nawet daty wpisu. W każdym razie wciąż moja odpowiedź jest ważna. – simo

0

Poniższa pracował dla mnie w meteor, który wykorzystuje moduł npm dla keepaliveagent

var agent = new KeepAliveAgent({ maxSockets: 1 }); 

var options = { 
    agent:agent, 
    headers: {"Connection":"Keep-Alive"} 
} 

try { 
    var client = Soap.createClient(url); 

    var result = client.myfirstfunction(args,options); 

//process result 
    result = client.mysecondfunction(args,options); 

} 

Zarówno metoda zwraca zwraca dane w jednym połączenia sieciowego. Przekazujesz opcje w każdym wywołaniu metody