node.js http.get se cuelga después de 5 solicitudes al sitio remoto

Estoy escribiendo un punto final de API simple para determinar si mi servidor puede llegar a Internet. Funciona de maravilla, pero después de 5 solicitudes (exactamente 5, cada vez) la solicitud se cuelga. Lo mismo sucede cuando cambio Google a Hotmail.com, lo que me hace pensar que esto es algo de mi lado. ¿Debo cerrar las solicitudes de http.get? Tenía la impresión de que esta función cierra las solicitudes automáticamente.

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

Aquí está el motivo de los “exactamente 5” : https://nodejs.org/docs/v0.10.36/api/http.html#http_agent_maxsockets

Internamente, el módulo http usa una clase de agente para administrar solicitudes HTTP. Ese agente permitirá, de forma predeterminada, un máximo de 5 conexiones abiertas al mismo servidor HTTP.

En su código, no consume la respuesta real enviada por Google. Entonces el agente asume que no ha terminado con la solicitud, y mantendrá la conexión abierta. Entonces, después de 5 solicitudes, el agente no le permitirá crear una nueva conexión y comenzará a esperar que se complete cualquiera de las conexiones existentes.

La solución obvia sería consumir los datos:

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

Si se encuentra con el problema de que su ruta /api/internetcheck se llama mucho, por lo que debe permitir más de 5 conexiones concurrentes, puede boost el tamaño del grupo de conexiones o simplemente desactivar el agente por completo (aunque aún necesidad de consumir los datos en ambos casos);

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

O quizás use una solicitud HEAD lugar de GET .

(PD: en caso de que http.get genere un error, aún debe finalizar la respuesta HTTP utilizando res.end() o algo así).

NOTA : en las versiones de Node.js> = 0.11, maxSockets está configurado en Infinity .

Si espera lo suficiente, las 5 solicitudes se agotarán y las 5 siguientes se procesarán para que la aplicación no se cuelgue porque eventualmente procesará todas las solicitudes.

Para acelerar el proceso, debe hacer algo con los datos de respuesta, como r.on('data', function() {});