Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

node.js http.get hangs after 5 requests to remote site

I'm writing a simple api endpoint to determine if my server is able to reach the internet. It works great, but after 5 requests (exactly 5, every time) the request hangs. Same thing happens when I switch Google to Hotmail.com, which makes me think that this is something on my end. Do I need to close the http.get requests? I was under the impression that this function closes the requests automatically.

// probably a poor assumption, but if Google is unreachable its generally safe to say     that the server can't access the internet // using this client side in the dashboard to enable/disable internet resources  app.get('/api/internetcheck', function(req, res) { console.log("trying google...");     http.get("http://www.google.com", function(r){         console.log("Got status code!: " +r.statusCode.toString());         res.send(r.statusCode.toString());         res.end();         console.log("ended!");      }).on('error', function(e) {         console.log("Got error: " + e.message);     }); }); 
like image 499
scald Avatar asked Jun 06 '13 15:06

scald


People also ask

How many HTTP requests can node js handle?

As is, node. js can process upwards of 1000 requests per second and speed limited only to the speed of your network card. Note that it's 1000 requests per second not clients connected simultaneously. It can handle the 10000 simultaneous clients without issue.

CAN node js handle multiple requests?

The entire NodeJS architecture is not single-threaded. How NodeJS handle multiple client requests? NodeJS receives multiple client requests and places them into EventQueue. NodeJS is built with the concept of event-driven architecture.

Do node js servers block on HTTP requests?

Your code is non-blocking because it uses non-blocking I/O with the request() function. This means that node. js is free to service other requests while your series of http requests is being fetched.

How does node js handle high traffic?

If you have a high‑traffic site, the first step in increasing application performance is to put a reverse proxy server in front of your Node. js server. This protects the Node.


1 Answers

Here's the reason of the "exactly 5": https://nodejs.org/docs/v0.10.36/api/http.html#http_agent_maxsockets

Internally, the http module uses an agent class to manage HTTP requests. That agent will, by default, allow for a maximum of 5 open connections to the same HTTP server.

In your code, you don't consume the actual response sent by Google. So the agent assumes that you're not done with the request, and will keep the connection open. And so after 5 requests, the agent won't allow you to create a new connection anymore and will start waiting for any of the existing connections to complete.

The obvious solution would be to just consume the data:

http.get("http://www.google.com", function(r){   r.on('data', function() { /* do nothing */ });   ... }); 

If you run into the problem that your /api/internetcheck route is called a lot, so you need to allow for more than 5 concurrent connections, you can either up the connection pool size, or just disable the agent completely (although you would still need to consume the data in both cases);

// increase pool size http.globalAgent.maxSockets = 100;  // disable agent http.get({ hostname : 'www.google.com', path : '/', agent : false }, ...) 

Or perhaps use a HEAD request instead of GET.

(PS: in case http.get generates an error, you should still end the HTTP response by using res.end() or something like that).

NOTE: in Node.js versions >= 0.11, maxSockets is set to Infinity.

like image 88
robertklep Avatar answered Sep 19 '22 22:09

robertklep