2015-01-30 8 views
7

Ich versuche, einen HTTP-Client einzurichten, um die zugrunde liegende Verbindung in node.js offen zu halten (Keep-Alive), aber es scheint, dass das Verhalten nicht den Dokumenten entspricht (http://nodejs.org/api/http.html#http_class_http_agent).HTTP keep-alive in node.js

Ich erstelle einen neuen HTTP-Agenten, setze die maxSockets-Eigenschaft auf 1 und fordere jede Sekunde eine URL (zum Beispiel http://www.twilio.com/).

Es scheint, dass bei jeder Anfrage der Socket geschlossen ist und ein neuer Socket erstellt wird. Ich habe dies mit node.js 0.10.25 und 0.10.36 unter Ubuntu 14.04 getestet.

Hat jemand die Möglichkeit gehabt, am Leben zu bleiben, um zu arbeiten? Hier

ist der Code:

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

Was zeigt 'console.dir (res.headers.connection)' in Ihrem 'http.get()' Callback? – mscdex

+0

Ich hatte dies bereits überprüft, und der Host gibt in der Antwort den Header "Connection: keep-alive" zurück, was darauf hinweist, dass er akzeptiert, die Verbindung offen zu halten. – quentinadam

Antwort

0

Ich denke, es sollte 0.12+ auf Knoten arbeiten. Sie können auch einen anderen Agenten für diesen Zweck verwenden. Zum Beispiel keep-alive-agent können tun, was Sie wollen:

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

Wenn ich die Verbindung Pool nicht alles täuscht wurde in 0.12 implementiert.

Also, wenn Sie einen Verbindungspool vor 0,12 haben möchten, können Sie einfach verwenden, um die request Modul:

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

Wenn Sie Knoten verwenden 0.12+ und Sie möchten direkt mit dem HTTP-Core-Modul verwenden, können Sie dann verwenden kann dies zu Ihrem Agenten zu initialisieren:

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

Beachten Sie die keepAlive: true Eigenschaft, dass erforderlich ist, die Buchse offen zu halten.

Sie können auch einen Agenten an das Modul request übergeben, das wiederum nur auf 0.12+ funktioniert, andernfalls wird standardmäßig die interne Poolimplementierung verwendet.

+0

Offensichtlich, zum Zeitpunkt meiner Post, war die letzte stabile Version von Node.js 0.10, und die Dokumente, die ich verlinkte, wo die 0.10 Dokumente. Danke für die Antwort, ich werde es versuchen, wenn ich eine Chance bekomme (ich hatte inzwischen einen Workaround implementiert). – quentinadam

+0

Ich habe das Postdatum nicht einmal bemerkt. Wie auch immer, meine Antwort ist immer noch gültig. – simo

0

Die unten arbeitete für mich in Meteor, die das NPM-Modul für keepaliveagent verwendet

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); 

} 

Sowohl die Methodenaufrufe gibt Daten in einem Socket-Verbindung. Sie übergeben die Optionen in jedem Methodenaufruf