Async: mapLimit с ограничением n/sec

Созданный на 27 окт. 2016  ·  8Комментарии  ·  Источник: caolan/async

Можно ли ограничить параллельное выполнение числом в секунду?
Это необходимо для таких сервисов, как лимиты и квоты Google Sheet API (см. https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas), которые ограничивают количество запросов в секунду ( QPS) на IP-адрес.
Спасибо!

docs feature wont fix

Самый полезный комментарий

ОП: может быть, вы уже решили эту проблему… Я использовал другой пакет NPM для реализации ограничения скорости с использованием моделей дырявого ведра или токена. https://www.npmjs.com/package/limiter Раньше у меня это хорошо работало. Чтобы создать функцию сопоставления с ограниченной скоростью, просто сделайте что-то вроде этого. Ваша функция сопоставления напрямую используется с async.

var RateLimiter = require("limiter").RateLimiter;
var limiter = new RateLimiter(2, "second");
var async = require('async');

function rateLimitedMapper(item, callback)
{
  limiter.removeTokens(1, function(err, remainingRequests) {
    console.log("working on item: " + item);
    callback(null, item.length);
  });
}

async.map(input, rateLimitedMapper, function(err, results) {
  // do something with results
 });

Все 8 Комментарий

О подобных функциях уже спрашивали. ( # 1113 # 1082 # 1020 # 942 # 37 ) Существует спрос на некоторую функциональность «регулируемой очереди», но правильное управление такой конструкцией является сложной проблемой.

Это то, для чего люди используют специальные библиотеки и системы очередей сообщений.

tl;dr you/async для этого понадобится какая-то функция сглаживания. Если бы мы сделали это, мы, вероятно, реализовали бы функцию экспоненциального сглаживания a tokenbucket .

Если кто-то заинтересован в работе над этим, дайте нам знать :)

ОП: может быть, вы уже решили эту проблему… Я использовал другой пакет NPM для реализации ограничения скорости с использованием моделей дырявого ведра или токена. https://www.npmjs.com/package/limiter Раньше у меня это хорошо работало. Чтобы создать функцию сопоставления с ограниченной скоростью, просто сделайте что-то вроде этого. Ваша функция сопоставления напрямую используется с async.

var RateLimiter = require("limiter").RateLimiter;
var limiter = new RateLimiter(2, "second");
var async = require('async');

function rateLimitedMapper(item, callback)
{
  limiter.removeTokens(1, function(err, remainingRequests) {
    console.log("working on item: " + item);
    callback(null, item.length);
  });
}

async.map(input, rateLimitedMapper, function(err, results) {
  // do something with results
 });

Это похоже на библиотеку, которую мы должны упомянуть в нашем файле readme. Кажется, он делает то, что мы хотели построить.

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

Да, если честно, я бы не был в восторге от поддержки чего-то подобного в Async. Есть так много ошибок при ограничении скорости.

Изменение тегов для обозначения того, что нам нужно место в документах для других библиотек, расширяющих Async.

Другой способ сделать это с помощью Promise.all и promise-throttle:

https://stackoverflow.com/questions/20253425/throttle-and-queue-up-api-requests-due-to-per-second-cap/47627820#47627820

Была ли эта страница полезной?
0 / 5 - 0 рейтинги