web-dev-qa-db-de.com

HTTP-Keep-Alive in node.js

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 docs ( http://nodejs.org/api) entspricht /http.html#http_class_http_agent ).

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

Es scheint, dass bei jeder Anforderung der Socket geschlossen 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 es jemand geschafft, weiter am Leben zu bleiben?

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();
8
quentinadam

Wenn ich mich nicht irre, wurde der Verbindungspool in 0.12 implementiert.

Wenn Sie also einen Verbindungspool vor 0.12 haben möchten, können Sie einfach das Modul request verwenden:

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

Wenn Sie den Knoten 0.12+ verwenden und das HTTP-Kernmodul direkt verwenden möchten, können Sie den Agenten folgendermaßen verwenden:

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

Beachten Sie die keepAlive: true-Eigenschaft, dh required , um den Socket offen zu halten.

Sie können auch einen Agenten an das Modul request übergeben, das wiederum nur für 0.12+ funktioniert, andernfalls wird standardmäßig die Implementierung des internen Pools verwendet.

4
simo

Ich denke, es sollte auf Knoten 0.12+ funktionieren. Möglicherweise möchten Sie auch einen anderen Agenten für diesen Zweck verwenden. Zum Beispiel kann keep-alive-agent machen, was Sie wollen:

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

Das Folgende hat für mich in Meteor funktioniert, das 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);

}

Beide Methodenaufrufe geben Daten in einer Socketverbindung zurück. Sie übergeben die Optionen in jedem Methodenaufruf

0