Async: mapLimit com limite n/sec

Criado em 27 out. 2016  ·  8Comentários  ·  Fonte: caolan/async

É possível limitar a execução paralela a um número/s?
Isso é necessário para esses serviços, como Limites e cotas da API do Google Sheet (consulte https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas) , que limitam o número de consultas por segundo ( QPS) por IP.
Obrigado!

docs feature wont fix

Comentários muito úteis

OP: talvez você já tenha resolvido isso ..... Eu usei outro pacote NPM para implementar a limitação de taxa usando modelos leakybucket ou token bucket. https://www.npmjs.com/package/limiter Isso funcionou bem para mim no passado. Para criar uma função de mapeador de taxa limitada, faça algo assim. Sua função de mapeador é usada diretamente com 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
 });

Todos 8 comentários

Recursos semelhantes foram questionados antes. ( #1113 #1082 #1020 #942 #37 ) Há demanda por algum tipo de funcionalidade de "fila limitada", mas gerenciar esse tipo de construção corretamente é um problema difícil.

Esse é o tipo de coisa para as quais as pessoas usam bibliotecas e sistemas de filas de mensagens dedicados.

tl;dr you/async precisaria de algum tipo de função de suavização para fazer isso. Se fôssemos fazer isso, provavelmente implementaríamos uma função de suavização exponencial em um token bucket .

Se alguém estiver interessado em trabalhar nisso, avise-nos :)

OP: talvez você já tenha resolvido isso ..... Eu usei outro pacote NPM para implementar a limitação de taxa usando modelos leakybucket ou token bucket. https://www.npmjs.com/package/limiter Isso funcionou bem para mim no passado. Para criar uma função de mapeador de taxa limitada, faça algo assim. Sua função de mapeador é usada diretamente com 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
 });

Isso parece uma lib que devemos mencionar em nosso readme. Parece fazer o que queríamos construir.

Sim, está usando um token bucket sob o capô, que é a mesma abordagem que eu estava tomando. Eu ficaria muito bem adiando a limitação de taxa para bibliotecas externas :)

Sim, honestamente, eu não ficaria feliz em ter que apoiar algo assim dentro do Async. Há tantas pegadinhas ao fazer a limitação de taxa.

Alterando as tags para significar que precisamos de um lugar nos documentos para outras bibliotecas que estendem o Async.

Esta página foi útil?
0 / 5 - 0 avaliações