web-dev-qa-db-fra.com

HTTP Keep-Alive dans le fichier node.js

J'essaie de configurer un client HTTP pour garder la connexion sous-jacente ouverte (garder en vie) dans node.js, mais il semble que le comportement ne corresponde pas à la documentation ( http://nodejs.org/api /http.html#http_class_http_agent ).

Je crée un nouvel agent HTTP, définissant la propriété maxSockets sur 1 et demandant une URL (par exemple, http://www.twilio.com/) toutes les secondes.

Il semble que, à chaque requête, le socket soit fermé et qu'un nouveau socket soit créé ... Je l'ai testé avec node.js 0.10.25 et 0.10.36 sous Ubuntu 14.04.

Quelqu'un a-t-il réussi à rester en vie au travail?

Voici le 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

Si je ne me trompe pas, le pool de connexion a été implémenté en 0.12.

Donc, si vous voulez avoir un pool de connexion antérieur à 0.12, vous pouvez simplement utiliser le module request :

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

Si vous utilisez le noeud 0.12+ et que vous souhaitez utiliser directement le module principal HTTP, vous pouvez l'utiliser pour initialiser votre agent:

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

Notez la propriété keepAlive: true, c’est-à-dire required pour garder le socket ouvert.

Vous pouvez également transmettre un agent au module request , qui fonctionne à nouveau uniquement à partir de la version 0.12, sinon la mise en œuvre du pool interne est effectuée par défaut.

4
simo

Je suppose que cela devrait fonctionner sur le noeud 0.12+. Vous pouvez également utiliser un agent différent à cette fin. Par exemple, keep-alive-agent peut faire ce que vous voulez:

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

Le ci-dessous a fonctionné pour moi dans météore, qui utilise le module npm pour 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);

}

Les deux appels de méthode renvoient des données dans une connexion de socket. Vous passez les options dans chaque appel de méthode

0
Vinay Prabhakaran