Настройки пула Nodejs Max Socket Pooling

Итак, я пытаюсь оптимизировать мое приложение node, и мое приложение делает запросы HTTP и HTTPS.

В этой статье из LinkedIn для быстрого выполнения node предлагается отключить объединение пулов, чтобы удалить ограничение из 5 сокетов:

// Disable socket pooling
var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)

Теперь от Mikeal (разработчика запроса) на GitHub он предлагает:

require('http').globalAgent.maxSockets = Infinity

Чтобы быть справедливым, он не предлагает бесконечности, но вы можете принести туда любую разумную ценность.

Теперь мое приложение использует http и https, поэтому я использовал этот код:

var http = require('http');
http.globalAgent.maxSockets = 30;
var https = require('https');
https.globalAgent.maxSockets = 30;

Когда я это сделаю, я получаю эту ошибку:

TypeError: Невозможно установить свойство maxSockets из undefined

Наконец, глядя на HTTP-документ, он не показывает "globalAgent", но вместо этого показывает только agent.maxSockets.

Итак, сначала мне интересно, какой лучший синтаксис для переопределения этого параметра?

Во-вторых, что такое оптимальное значение? Это зависит от объема памяти моего сервера? Его пропускная способность?

Ответ 1

Что касается TypeError, который вы получаете, я не получаю никаких ошибок при настройке http.globalAgent.maxSockets или https.globalAgent.maxSockets. Там что-то еще происходит в вашем приложении.

Что касается первой части вашего вопроса, поймите, что вы не просто ограничены использованием глобального агента. Вы можете создать свои собственные экземпляры Agent и использовать их для выполнения запросов:

var http = require('http');
var myAgent = new http.Agent();

http.request({ ... , agent: myAgent }, ...);

Запросы, сделанные с использованием настраиваемых агентов, вообще не взаимодействуют с глобальным агентом. Глобальный агент является стандартным по умолчанию, который используется, если вы явно не укажете один или не отключите использование агентов вместе (передав false в качестве значения Agent в параметрах запроса).

Итак, когда docs говорят agent.maxSockets, они действительно ссылаются на общий Agent класс; каждый экземпляр имеет это свойство, включая глобальный (по умолчанию) агент – к которому вы должны получить доступ через http.globalAgent.

Вторая часть вашего вопроса (оптимальная maxSockets) - трудная задача ответить. Помните, что многие серверы будут ограничивать количество одновременных подключений от данного IP-адреса, и вы хотите удостовериться, что вы не подавляете сервер с большим количеством одновременных запросов. (С достаточным количеством запросов, которые вы запускаете сразу, вы эссенциально ДОЗИРУЙТЕ сервер.)