Подтвердить что ты не робот

Как использовать пул запросов js (Node js Module)

Может кто-нибудь объяснить, как использовать хэш-код request.js?

примечания github говорят об этом в пулах:

pool - хэш-объект, содержащий агентов для этих запросов. Если опустить это запрос будет использовать глобальный пул, который установлен на node maxSockets по умолчанию.

pool.maxSockets - Целое число, содержащее максимальное количество сокетов в пуле.

У меня есть этот код для записи в экземпляр CouchDB (обратите внимание на вопросительные знаки). В принципе, любой пользователь, который подключается к моему серверу node, будет записывать в DB независимо друг от друга:

var request = require('request');

request({
    //pool:,     //  ??????????????????
    'pool.maxSockets' : 100,  //  ??????????????????
    'method' : 'PUT',
    'timeout' : 4000,
    'strictSSL' : true,
    'auth' : {
        'username' : myUsername,
        'password' : myPassword
    },
    'headers' : {
        'Content-Type': 'application/json;charset=utf-8',
        'Content-Length': myData.length
    },
    'json' : myData,
    'url': myURL
}, function (error, response, body){
    if (error == null) {
        log('Success: ' + body);
    }
    else {
        log('Error: ' + error);
    }
});

Что лучше для высокой пропускной способности/производительности?
Каковы недостатки большого числа "maxSockets"?
Как создать отдельный пул для использования вместо глобального пула? Почему я хочу создать отдельный пул?

4b9b3361

Ответ 1

Опция пула в запросе использует агент, который такой же, как http.Agent из стандартной библиотеки http. См. Документацию для http.Agent и см. Параметры agent в http.request.

Использование

pool = new http.Agent(); //Your pool/agent
http.request({hostname:'localhost', port:80, path:'/', agent:pool});
request({url:"http://www.google.com", pool:pool });

Если вам интересно узнать, что вы можете видеть на консоли,

{ domain: null,
  _events: { free: [Function] },
  _maxListeners: 10,
  options: {},
  requests: {},
  sockets: {},
  maxSockets: 5,
  createConnection: [Function] }

maxSockets определяет, сколько одновременных сокетов, которые агент может открыть для каждого хоста, присутствует в агенте по умолчанию со значением 5. Обычно вы должны установить его раньше. Передача pool.maxSockets явно переопределит свойство maxSockets в pool. Этот параметр имеет смысл только при передаче опции pool.

Так разные способы его использования:

  • Не указывать опцию agent, будет undefined будет использовать http.globalAgent. Случай по умолчанию.
  • Дайте ему false, отключит объединение.
  • Предоставьте свой собственный агент, как показано выше.

Отвечая на ваши вопросы в обратном порядке.

Пул предназначен для хранения определенного количества сокетов, которые будут использоваться программой. Во-первых, сокеты повторно используются для разных запросов. Таким образом, это снижает накладные расходы на создание новых сокетов. Во-вторых, он использует меньше сокетов для запросов, но последовательно. Он не будет использовать все сокеты. В-третьих, он поддерживает очередь запросов. Таким образом, подразумевается время ожидания.

Пул действует как кеш, так и дроссель. Эффект дроссельной заслонки будет более заметным, если у вас больше запросов и меньших сокетов. При использовании глобального пула он может ограничивать работу двух разных клиентов, нет гарантий относительно времени ожидания. Раздельный бассейн для них будет более справедливым для обоих (подумайте, если кто-то попросит больше других).

Свойство maxSockets дает максимум concurrency. Это увеличивает общую пропускную способность/производительность. Недостаток уменьшает эффект дроссельной заслонки. Вы не можете контролировать максимальные издержки. Устанавливая его на большое количество, это будет не похоже на объединение. Вы начнете получать ошибки, такие как сокет, недоступный. Это не может быть больше допустимого максимального предела, установленного ОС.

Итак, что лучше для высокой производительности/производительности? Существует физический предел пропускной способности. Если вы достигнете предела, время ответа увеличится с количеством подключений. Вы можете продолжать увеличивать maxSockets до тех пор, но после этого увеличение не поможет.

Ответ 2

Вы должны посмотреть модуль forever-agent, который является оберткой http.Agent.

Как правило, пул - это хэш-объект, содержащий несколько http-агентов. он пытается повторно использовать созданные сокеты из соединения "keep-alive". на хост: порт. Например, вы выполнили несколько запросов на размещение www.domain1.com:80 и www.domain2.com:80, если какой-либо из ответов не содержит заголовка Connection: close, он поместит сокет в пул и передаст его ожидающим запросам.

Если ожидающие запросы не нуждаются в этом объединенном сокете, он будет уничтожен.

maxSockets означает максимальные параллельные сокеты для одного хоста: порт, значение по умолчанию 5. Я бы предложил подумать об этом значении с вашим сценарием вместе:

  • В соответствии с этими посещениями горячих сайтов вы должны создать отдельный пул. так что новые запросы могут быстро запускать простаивающие сокеты. Дело в том, что вам нужно уменьшить количество ожидающих запросов на определенные сайты, увеличив значение maxSockets пула. Обратите внимание, что не имеет значения, если вы установите очень высокое число на maxSockets, когда соединение хорошо управляется сервером происхождения через ответный заголовок Connection: close.

  • В соответствии с теми сайтами, которые ваши запросы вряд ли посещают, используйте pool: false для отключения пула.

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

// create a separate socket pool with 10 concurrent sockets as max value.
var separateReqPool = {maxSockets: 10};
var request = require('request');

request({url: 'http://localhost:8080/', pool: separateReqPool}, function(e, resp){
});