Open source
HTTP Client Rate Limits for Laravel
composer require roundly-consulting/http-client-rate-limits-for-laravelPrehľad
Obmedzte odchádzajúce požiadavky, ktoré posiela HTTP klient Laravelu. Nastavíte limit — za sekundu, minútu, hodinu alebo deň — a malý Guzzle middleware rozloží volania v čase: pri dosiahnutí limitu počká presne toľko, koľko je potrebné, takže kvótu externého API nikdy neprekročíte. Každý limit vzniká cez jednu fasádu RateLimits, takže nakonfigurované úložisko — alebo testovací fake — platí všade. Pomenované profily, zložené okná, samostatné limity pre vlastníkov, adaptívne spomalenie podľa hlavičiek odpovede a zdieľané úložisko v cache, Redise či databáze sú súčasťou balíka. Licencia MIT a minimum závislostí: len oficiálne komponenty Laravelu a dva malé balíky Roundly.
Čo získate
Obmedzenie na jeden riadok
Http::rateLimit(30) na akejkoľvek požiadavke alebo limity z fasády RateLimits či injektovaného managera. Počká presne toľko, koľko treba, a potom odošle.
Profily a zložené okná
Limity definujete raz v konfigurácii a odkazujete na ne menom. Vynútite 5/s aj 100/min naraz — platí najprísnejšie okno.
Zdieľané úložiská
V pamäti, v ľubovoľnej cache Laravelu, v Redise alebo v databáze — každé overí a zapíše požiadavku jedným atomickým krokom, takže workery so spoločným limitom ho nikdy neprekročia.
Adaptívne spomalenie
Číta hlavičky Retry-After a X-RateLimit-* z odpovede, takže ďalšie volanie počká presne toľko, koľko server požaduje.
Rýchle zlyhanie, jitter a fronty
Obmedzte čakanie typovanou výnimkou, rozložte prebúdzanie jitterom alebo vráťte úlohu do fronty namiesto blokovania workera.
Udalosti a testovací fake
Udalosti RequestDeferred, RequestAllowed a RateLimitReset a zaznamenávajúci RateLimits::fake() s aserciami odložených, povolených aj vynulovaných limitov.
Dokumentácia
Inštalácia
Inštalácia cez Composer, voliteľné publikovanie konfigurácie a migrácia len pri použití DatabaseStore.
Konfigurácia
Každý konfiguračný kľúč, jeho predvolená hodnota a env premenná — profily, úložisko, deferrer, cache, Redis, databáza a udalosti.
Fasáda RateLimits
Jediný vstupný bod na tvorbu limitov — továrenské metódy pre okná, profily, zložené limity, prepisy úložiska a deferrera, Retry-After, fake.
DI a akcie
Namiesto fasády injektujte RateLimitManager alebo si RateLimit poskladajte ručne — balík nemá žiadne triedy akcií.
Obmedzenie požiadaviek
Obmedzte volania HTTP klienta Laravelu makrom Http::rateLimit() alebo Guzzle middlewarom RateLimit — od sekundy po deň.
Samostatné limity pre vlastníkov
Priraďte limit vlastníkovi — účtu, tenantovi, API kľúču či odchádzajúcej IP — aby nezávislí volajúci nezdieľali jeden limit.
Pomenované profily limitov
Definujte opakovane použiteľné limity raz v konfigurácii a odkazujte na ne menom — Http::rateLimit('github') — so všetkými voľbami.
Zložené limity
Vynúťte na jednej požiadavke viac okien — 5 za sekundu a 100 za minútu — o čakaní rozhoduje najprísnejšie okno.
Maximálne čakanie
Obmedzte, ako dlho môže volanie čakať; nad stropom vyhodí RateLimitExceededException namiesto blokovania.
Rozptyl čakania (jitter)
Pridajte k čakaniu náhodný čas navyše, aby sa workery neprebúdzali naraz — nikdy menej než skutočné čakanie; náhodnosť nahradíte v testoch.
Adaptívne obmedzovanie
Rešpektujte limit samotného servera — čítajte hlavičky Retry-After a X-RateLimit-* a spomaľte presne podľa požiadavky.
Retry-After a opakovanie pri 429
Spojte limiter s retry() od Laravelu a RateLimits::retryAfter(), aby ste rešpektovali odpovede 429 Too Many Requests.
Kontrola pred odoslaním
Zistite, koľko požiadaviek zostáva a o koľko bude ďalšia povolená — bez zaznamenania pokusu — a vynulujte limit kľúča.
Úložiská
Kde sa uchovávajú časové značky požiadaviek — v pamäti, v cache Laravelu, v Redise či v databáze —, ako ostávajú atomické a ako napísať vlastné.
Deferrery a úlohy vo fronte
Ako prebieha čakanie — predvolene uspanie na milisekundy, alebo vrátenie úlohy späť do fronty.
Predvolené hodnoty a prepisy
Predvolené úložisko a deferrer nastavte v konfigurácii, pre jedno miesto ich prepíšte cez RateLimits::usingStore() / usingDeferrer() alebo na inštancii.
Udalosti
Udalosti RequestDeferred, RequestAllowed a RateLimitReset na logovanie, grafy či upozornenia — alebo ich vypnite pre nulovú réžiu.
Výnimky
Každá typovaná výnimka balíka, kedy nastane, a jedna základná trieda na zachytenie všetkých.
Enum Timespan
Enum Timespan za každým oknom — od sekundy po deň — s kompletnou sadou enums-for-laravel pre popisy, možnosti a validáciu.
Testovanie
Nahraďte manager cez RateLimits::fake() a overujte odložené, povolené aj vynulované limity bez čakania a Redisu, alebo použite fake Sleep.
Požiadavky
PHP 8.4+ a Laravel 12 alebo 13; Redis len pre RedisStore, dve databázové tabuľky len pre DatabaseStore.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.