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.
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í pre prechodné chyby spojenia — 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.