HTTP keep-alive in node.js

I am trying to set-up a HTTP client to keep the underlying connection open (keep-alive) in node.js, but it seems that the behaviour does not correspond to the docs ().

I am creating a new HTTP agent, setting the maxSockets property to 1 and requesting an url (for instance ) every second.

It seems that on every request the socket is closed and a new socket is created. I have tested this with node.js 0.10.25 and 0.10.36 under Ubuntu 14.04.

Has anyone been able to get keep alive to work?

Here is the 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(' '/', function (error, res, body) { setTimeout(run, 1000); });
}
run();
2

3 Answers

If I'm not mistaken the connection pool was implemented in 0.12.

So if you want to have a connection pool prior 0.12 you can simply use the request module:

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

If you are using node 0.12+ and you want to use the HTTP core module directly, then you can use this to initialize your agent:

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

Notice the keepAlive: true property, that is required to keep the socket open.

You can pass an agent to the request module as well, again that works only on 0.12+ otherwise it defaults to internal pool implementation.

2

I guess it should work on node 0.12+. You may also want to use a different agent for this purpose. For example keep-alive-agent can do what you want:

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

The below worked for me in meteor which uses the npm module for 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);
}

Both the method calls returns data in one socket connection. You pass the options in each method call

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like