Drosseln und warten Sie API-Anfragen aufgrund der pro-Sekunde-Obergrenze
Ich verwende mikeal/Anfrageum API-Aufrufe. Eines der API ' s die ich am häufigsten verwenden (Shopify API). Vor kurzem eine neue Aufruf limitsehe ich Fehler wie:
Exceeded 6.0 calls per second for api client. Slow your requests or contact support for higher limits.
Habe ich schon bekommen ein upgrade, aber unabhängig davon, wie viel Bandbreite ich bekommen, die ich haben, um für dieses Konto. Eine große Mehrheit der Anträge auf Shopify API sind innerhalb async.anzeigen() Funktionen, die Schleife asynchrone requests, und sammeln die Leichen.
Ich bin auf der Suche für jede Hilfe, vielleicht eine Bibliothek, die bereits existiert, wäre das wrap-around-das Anfrage-Modul und tatsächlich blockieren, Schlaf -, Drossel -, zuweisen, verwalten, die viele gleichzeitige Anforderungen, die das versenden asynchron und beschränken zu sagen 6
Anforderungen gleichzeitig. Ich habe kein problem mit der Arbeit an einem solchen Projekt, wenn es nicht vorhanden ist. Ich weiß nur nicht, wie Sie zu behandeln diese Art von situation, und ich bin der Hoffnung, für eine Art standard.
Machte ich ein ticket mit mikeal/Anfrage.
InformationsquelleAutor der Frage ThomasReggi | 2013-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe laufen in das gleiche Problem mit verschiedenen APIs. AWS ist berühmt für die Drosselung als gut.
Ein paar Ansätze verwendet werden können. Sie erwähnt async.map () - Funktion. Haben Sie versucht,async.queue()? Die Warteschlange Methode sollte Ihnen ermöglichen, um eine Feste Grenze (wie 6) und alles, was über diesen Betrag wird in die Warteschlange gestellt werden.
Ein weiteres hilfreiches Werkzeug ist oibackoff. Dieser Bibliothek ermöglichen Ihnen die backoff Ihre Anfrage, wenn Sie einen Fehler erhalten, wieder aus dem server und versuchen Sie es erneut.
Kann es nützlich sein, legen Sie die beiden Bibliotheken, um sicherzustellen, dass beide Ihre Basen bedeckt sind: async.Warteschlange, um sicherzustellen, dass Sie nicht gehen über die Grenze, und oibackoff, um sicherzustellen, Sie bekommen eine weitere Chance auf immer Ihre Anfrage, wenn der server sagt Ihnen, es ein Fehler war.
InformationsquelleAutor der Antwort Dan
Für eine alternative Lösung, die ich verwendet, die Knoten-rate-limiter wickeln Sie das Anfrage-Funktion wie diese:
InformationsquelleAutor der Antwort Dmitry Chornyi
Den
npm
Paket einfache rate-limiter scheint eine sehr gute Lösung für dieses problem.Darüber hinaus ist es einfacher zu verwenden als
node-rate-limiter
undasync.queue
.Hier ist ein Ausschnitt, der zeigt, wie begrenzen alle Anfragen zu zehn pro Sekunde.
InformationsquelleAutor der Antwort Camilo Sanchez
Im async-Modul, dieses angeforderte feature ist geschlossen als "wont fix"
ein schwieriges problem." Siehe rechts von hier:
https://github.com/caolan/async/issues/1314
https://github.com/caolan/async/issues/37#issuecomment-14336237
Gibt es eine Lösung mit leakybucket oder token-bucket-Modell, dass es umgesetzt wird "limiter" npm-Modul als RateLimiter.
Siehe Beispiel hier: https://github.com/caolan/async/issues/1314#issuecomment-263715550
Ausgabe:
Können wir deutlich sehen, die rate von der Ausgabe, also 5 Anrufe für jede Sekunde.
InformationsquelleAutor der Antwort Manohar Reddy Poreddy
Hier ist meine Lösung verwenden Sie eine Bibliothek
request-promise
oderaxios
und wickeln Sie den Aufruf in dieser Verheißung.InformationsquelleAutor der Antwort ThomasReggi