2017-11-20 3 views
0

Ich arbeite an einer App, die das Abrufen von Daten von einem Drittanbieterserver erfordert, und dieser Server ermöglicht maximal 1 Anfrage pro Sekunde.Warteschlangenpreisbeschränkung

Jetzt alle Anfrage senden als Job und ich versuche Laravel "Rate Limiting" zu implementieren, um 1 Auftrag pro Sekunde freizugeben, aber nicht herausfinden, warum es implementiert werden sollte und es gibt keine realen Beispiel im Web.

Hat jemand das implementiert?

Irgendwelche Hinweise darauf?

+0

Machen Sie Ihren eigenen internen API-Aufruf, um die externe API zu konsumieren, verwenden Sie den Job, um Ihre eigene interne API zu konsumieren. Rate limit deine eigene interne API. – Ohgodwhy

Antwort

0

Vorausgesetzt, dass Sie nur einzelne Arbeiter haben Sie so etwas wie dies tun können:

  • tun, was
  • get Zeit durchgeführt werden muss (mit Mikrosekunden)
  • Schlafzeit, die 1s minus Differenz zwischen Finish Zeit und Startzeit

so im Grunde:

doSomething() 
$time = microtime(true); 
usleep(1000 - ($time - LARAVEL_START)); 
0

Sie können dieses Paket verwenden, um die Ratenbegrenzung mit Redis oder einer anderen Quelle, z. B. einer Datei, zu verwenden. Verwendet Einstellungen, um Bucketgröße und -rate als Bruchteile des Zeitlimits festzulegen, also sehr wenig Speicher.

composer require bandwidth-throttle/token-bucket 

https://github.com/bandwidth-throttle/token-bucket

Es ermöglicht Ihnen, die Prüfung in einer if, wickeln, damit es wartet für ein freies Token, 1 Minute in Ihrem Beispiel sofort zur Verfügung. Im Endeffekt lässt es den Dienst für die erforderliche Zeit bis zu einer neuen Minute schlafen.