Ответ 1
Здесь причина "точно 5": https://nodejs.org/docs/v0.10.36/api/http.html#http_agent_maxsockets
Внутренне модуль http
использует класс агента для управления HTTP-запросами. Этот агент будет по умолчанию разрешать максимум 5 открытых подключений к одному и тому же HTTP-серверу.
В вашем коде вы не используете фактический ответ, отправленный Google. Таким образом, агент предполагает, что вы не закончили с запросом и не откроете соединение. Итак, после 5 запросов агент больше не позволит вам создавать новое соединение и начнет ждать завершения любого из существующих подключений.
Очевидным решением было бы просто использовать данные:
http.get("http://www.google.com", function(r){
r.on('data', function() { /* do nothing */ });
...
});
Если вы столкнулись с проблемой, что ваш трафик /api/internetcheck
называется много, поэтому вам нужно разрешить более 5 одновременных подключений, вы можете либо увеличить размер пула подключений, либо просто полностью отключить агент (хотя вы все равно придется потреблять данные в обоих случаях);
// increase pool size
http.globalAgent.maxSockets = 100;
// disable agent
http.get({ hostname : 'www.google.com', path : '/', agent : false }, ...)
Или, возможно, используйте HEAD
запрос вместо GET
.
(PS: в случае, если http.get
генерирует ошибку, вы все равно должны завершить HTTP-ответ, используя res.end()
или что-то подобное).
ПРИМЕЧАНИЕ: в Node.js версиях >= 0.11, maxSockets
установлено значение Infinity
.