Obmedzenie požiadaviek
Každý HTTP poskytovateľ — google, ipinfo, ip2location a maxmind_web — posiela požiadavky cez http-client-rate-limits-for-laravel, takže volania sa spomalia skôr, než narazia na API tretej strany, namiesto zbytočných odpovedí 429. Každý poskytovateľ má vlastný limit s kľúčom geolocation:{provider}:{owner}. Offline poskytovatelia maxmind_database a default nerobia sieťové volania a nikdy sa nespomaľujú.
Predvolené limity
| Poskytovateľ | limit / per | Env |
|---|---|---|
google | 50 / second | GEOLOCATION_GOOGLE_RATELIMIT, …_PER |
ipinfo | 60 / minute | GEOLOCATION_IPINFO_RATELIMIT, …_PER |
ip2location | 60 / minute | GEOLOCATION_IP2LOCATION_RATELIMIT, …_PER |
maxmind_web | 60 / minute | GEOLOCATION_MAXMIND_WEB_RATELIMIT, …_PER |
Všetky limity sú adaptívne a predvolene čakajú.
Kľúče pre každého poskytovateľa
Každý HTTP poskytovateľ má blok rate_limits v services.<provider>:
'ipinfo' => [
// ...
'rate_limits' => [
'enabled' => env('GEOLOCATION_IPINFO_RATELIMIT_ENABLED', true),
'owner' => env('GEOLOCATION_RATELIMIT_OWNER', 'app'),
'limit' => env('GEOLOCATION_IPINFO_RATELIMIT', 60),
'per' => env('GEOLOCATION_IPINFO_RATELIMIT_PER', 'minute'), // second|minute|hour|day
'adaptive' => env('GEOLOCATION_IPINFO_RATELIMIT_ADAPTIVE', true),
'max_wait' => env('GEOLOCATION_IPINFO_RATELIMIT_MAX_WAIT'), // ms; null = pace, set = fail fast
'jitter' => env('GEOLOCATION_IPINFO_RATELIMIT_JITTER'), // ms; null = none
],
],| Kľúč | Predvolené | Env (pre google) | Účel |
|---|---|---|---|
enabled | true | GEOLOCATION_GOOGLE_RATELIMIT_ENABLED | false posiela bežným klientom bez obmedzenia. |
owner | app | GEOLOCATION_RATELIMIT_OWNER | Segment vlastníka v kľúči limitu (spoločný pre všetkých poskytovateľov). Prázdna hodnota sa považuje za nenastavenú (platí predvolená); hodnota, ktorá nie je reťazcom, vyhodí výnimku. |
limit | 50 (google) / 60 | GEOLOCATION_GOOGLE_RATELIMIT | Max počet požiadaviek za okno, najmenej 1. |
per | second (google) / minute | GEOLOCATION_GOOGLE_RATELIMIT_PER | Okno: second, minute, hour alebo day; prázdna hodnota sa považuje za nenastavenú (platí predvolená); iná hodnota vyhodí InvalidConfigurationException. |
adaptive | true | GEOLOCATION_GOOGLE_RATELIMIT_ADAPTIVE | Rešpektovať Retry-After z odpovede 429. |
max_wait | null | GEOLOCATION_GOOGLE_RATELIMIT_MAX_WAIT | Strop na rýchle zlyhanie v ms (0 alebo viac); null alebo prázdna hodnota = čakať. |
jitter | null | GEOLOCATION_GOOGLE_RATELIMIT_JITTER | Náhodný rozptyl v ms pridaný k odkladu (0 alebo viac); null alebo prázdna hodnota nepridá žiadny. |
GEOLOCATION_RATELIMIT_OWNER=app
GEOLOCATION_GOOGLE_RATELIMIT=50
GEOLOCATION_GOOGLE_RATELIMIT_PER=second
GEOLOCATION_IPINFO_RATELIMIT=60
GEOLOCATION_IPINFO_RATELIMIT_PER=minute
GEOLOCATION_IPINFO_RATELIMIT_MAX_WAIT=2000 # fail fast instead of waiting more than 2 sČakať alebo rýchlo zlyhať
Predvolene limiter počká, kým sa okno uvoľní, a potom odošle. Ak nastavíte max_wait (v milisekundách), volanie radšej rýchlo zlyhá: keď by odklad prekročil strop, vyhodí sa RateLimitExceededException. Dedí z GeolocationException, nesie ->provider a implementuje kontrakt HasRetryAfter z toolkitu:
use RoundlyConsulting\Geolocation\Exceptions\RateLimitExceededException;
try {
$location = Geolocation::locateIp($request->ip());
} catch (RateLimitExceededException $e) {
$e->provider; // e.g. 'ipinfo'
return response('Location lookup is busy, please retry.', 429)
->header('Retry-After', (string) $e->retryAfterSeconds());
}Pri zapnutom adaptive nastaví Retry-After z odpovede 429 limiter pre ďalšie volanie, pričom samotná neúspešná odpoveď sa stále zmení na null a pipeline pokračuje.
Hromadná práca
batch() aj distanceMatrix() idú cez rovnaký limiter, takže hromadné vyhľadávania sa automaticky spomalia podľa limitu poskytovateľa. Matica vzdialeností rozdelená na viac požiadaviek zaberie v limite jedno miesto za každú požiadavku.
Spoločné limity pre viac workerov
Balík na limity predvolene používa úložisko v pamäti — jeden limit na proces, čo stačí pre jeden worker alebo beh v CLI. Pre kvótu účtu zdieľanú medzi workermi a servermi ho v jeho vlastnej konfigurácii nasmerujte na zdieľané úložisko (HTTP_CLIENT_RATE_LIMITS_STORE); tento balík žiadne nevynucuje:
// config/http-client-rate-limits.php — one budget across every worker and server
'store' => \RoundlyConsulting\HttpClientRateLimits\Store\RedisStore::class,Natívne ->retry(times, delay) Laravelu naďalej platí, no len pre prechodné chyby: chyba spojenia alebo odpoveď 5xx sa zopakuje najviac toľkokrát, koľko určuje services.<provider>.retry, kým odpoveď 4xx — zlý kľúč, neznáma IP, 429 — sa vráti hneď a znova sa neposiela. Všetky pokusy jedného volania zdieľajú jedno miesto v limite; limiter je dodatočná vrstva na tempo odchádzajúcich požiadaviek, nie náhrada.
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.