Async: mapLimit mit n/s-Grenze

Erstellt am 27. Okt. 2016  ·  8Kommentare  ·  Quelle: caolan/async

Ist es möglich, die parallele Ausführung auf eine Anzahl/Sekunde zu begrenzen?
Dies ist für Dienste wie Google Sheet API Limits and Quotas (siehe https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas) erforderlich, die die Anzahl der Abfragen pro Sekunde begrenzen ( QPS) pro IP.
Danke!

docs feature wont fix

Hilfreichster Kommentar

OP: Vielleicht haben Sie das bereits gelöst ... Ich habe ein anderes NPM-Paket verwendet, um die Ratenbegrenzung mit Leakybucket- oder Token-Bucket-Modellen zu implementieren. https://www.npmjs.com/package/limiter Das hat in der Vergangenheit gut für mich funktioniert. Um eine ratenbegrenzte Mapper-Funktion zu erstellen, tun Sie einfach so etwas. Ihre Mapper-Funktion wird direkt mit async verwendet.

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
 });

Alle 8 Kommentare

Ähnliche Funktionen wurden schon früher gefragt. ( # 1113 # 1082 # 1020 # 942 # 37 ) Es besteht Nachfrage nach einer Art "gedrosselter Warteschlangen"-Funktionalität, aber die ordnungsgemäße Verwaltung dieser Art von Konstrukt ist ein schwieriges Problem.

Dies ist die Art von Dingen, für die Leute dedizierte Nachrichtenwarteschlangenbibliotheken und -systeme verwenden.

tl;dr you/async bräuchte dazu eine Art Glättungsfunktion. Wenn wir dies tun würden, würden wir wahrscheinlich eine exponentielle Glättungsfunktion, einen Token-Bucket , implementieren.

Wenn jemand daran interessiert ist, daran zu arbeiten, lass es uns wissen :)

OP: Vielleicht haben Sie das bereits gelöst ... Ich habe ein anderes NPM-Paket verwendet, um die Ratenbegrenzung mit Leakybucket- oder Token-Bucket-Modellen zu implementieren. https://www.npmjs.com/package/limiter Das hat in der Vergangenheit gut für mich funktioniert. Um eine ratenbegrenzte Mapper-Funktion zu erstellen, tun Sie einfach so etwas. Ihre Mapper-Funktion wird direkt mit async verwendet.

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
 });

Das scheint eine Bibliothek zu sein, die wir in unserer Readme erwähnen sollten. Scheint das zu tun, was wir bauen wollten.

Ja, es verwendet einen Token-Eimer unter der Haube, was der gleiche Ansatz ist, den ich gewählt habe. Es wäre mir recht, wenn ich die Ratenbegrenzung auf externe Bibliotheken verschieben würde :)

Ja, ehrlich gesagt wäre ich nicht begeistert, so etwas innerhalb von Async unterstützen zu müssen. Es gibt so viele Fallstricke bei der Ratenbegrenzung.

Ändern der Tags darauf, um anzuzeigen, dass wir einen Platz in den Dokumenten für andere Bibliotheken benötigen, die Async erweitern.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen