web-dev-qa-db-ja.com

node.jsのHTTPキープアライブ

Node.jsで基になる接続を開いたままにする(キープアライブ)ようにHTTPクライアントをセットアップしようとしていますが、動作がドキュメント( http://nodejs.org /api/http.html#http_class_http_agent )。

新しいHTTPエージェントを作成して、maxSocketsプロパティを1に設定し、URLを要求しています(たとえば、http://www.twilio.com/) 毎秒。

リクエストごとにソケットが閉じられ、新しいソケットが作成されるようです。 Ubuntu 14.04でnode.js 0.10.25および0.10.36を使用してこれをテストしました。

誰かが仕事を続けることができましたか?

これがコードです:

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

間違えなければ、接続プールは0.12で実装されました。

したがって、0.12より前の接続プールが必要な場合は、単純に request モジュールを使用できます。

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

ノード0.12+を使用していて、HTTPコアモジュールを直接使用する場合は、これを使用してエージェントを初期化できます。

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

keepAlive: trueプロパティ、つまり、ソケットを開いたままにするためにrequiredです。

エージェントを request モジュールに渡すこともできます。これも0.12+でのみ機能し、それ以外の場合はデフォルトで内部プール実装になります。

6
simo

ノード0.12+で動作するはずです。この目的で別のエージェントを使用することもできます。たとえば keep-alive-agent はあなたが望むことをすることができます:

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

以下は、keepaliveagentにnpmモジュールを使用するmeteorで私のために働きました

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

}

どちらのメソッド呼び出しも、1つのソケット接続でデータを返します。各メソッド呼び出しでオプションを渡します

0