Obmedzenie požiadaviek
Každá požiadavka na apiserver prechádza cez http-client-rate-limits-for-laravel s kľúčom pre každý apiserver: host, port a predponu cesty z URL klastra, takže každý klaster za proxy typu Rancher má vlastný rozpočet. Jeden vyťažený klaster nikdy nezablokuje iný, ani keď všetci klienti používajú rovnaké meno managera, a klienti toho istého apiservera zdieľajú jeden rozpočet bez ohľadu na meno managera či prihlasovacie údaje. API Priority and Fairness v Kubernetes funguje pre každý apiserver zvlášť, takže to priamo zodpovedá tomu, ako server presadzuje vlastné limity.
Predvolene klient pošle najviac 400 požiadaviek za minútu na klaster a všetko nad to dávkuje — počká, kým sa okno uvoľní, namiesto chyby. Pri zapnutom adaptive sa z odpovede 429 od apiservera prečíta hodnota Retry-After a limiter sa podľa nej doladí, takže ďalšia požiadavka počká presne toľko, koľko server žiadal. Nastavíte to cez env:
KUBERNETES_RATELIMIT=400 # attempts per window, per cluster
KUBERNETES_RATELIMIT_TIMESPAN=minute
KUBERNETES_RATELIMIT_ADAPTIVE=true # honour 429 Retry-After
# KUBERNETES_RATELIMIT_MAX_WAIT=2000 # ms — fail fast instead of waiting
# KUBERNETES_RATELIMIT_JITTER=250 # ms of random spread per defer
# KUBERNETES_RATELIMIT_OWNER=app
# KUBERNETES_RATELIMIT_ENABLED=false # the raw, unthrottled clientKľúč rozpočtu je k8s:<owner>:<apiserver>, kde <apiserver> je host URL klastra spolu s neštandardným portom a predponou cesty; cez rate_limits.owner môže viac aplikácií či workerov rozpočet zdieľať — alebo oddeliť.
Každý kľúč rate_limits sa číta prísne: nerozpoznaný prepínač, necelé číslo či číslo mimo rozsahu, preklep v timespan alebo owner, ktorý nie je reťazec, vyhodí InvalidConfigurationException s názvom kľúča, namiesto aby sa potichu použila predvolená hodnota; prázdna hodnota sa počíta ako nenastavená a dostane predvolenú hodnotu (pozrite Konfigurácia).
Okamžitá chyba namiesto čakania
Nastavte strop max_wait v milisekundách. Ak by požiadavka musela čakať dlhšie, namiesto blokovania vyhodí RateLimitExceededException. Ponúka ->cluster (meno registrovaného klastra, pri ad-hoc klientovi host apiservera) a retryAfterSeconds():
use RoundlyConsulting\KubernetesApi\Exceptions\RateLimitExceededException;
try {
$cluster->pods()->get();
} catch (RateLimitExceededException $e) {
report("Cluster {$e->cluster} is throttled; retry in {$e->retryAfterSeconds()}s");
}Výnimka implementuje kontrakt HasRetryAfter z package-toolkit-for-laravel, takže aplikácia môže všetky zlyhania limitov z balíkov Roundly obslúžiť na jednom mieste:
use RoundlyConsulting\PackageToolkit\Contracts\HasRetryAfter;
if ($e instanceof HasRetryAfter) {
return response('Too Many Requests', 429, ['Retry-After' => $e->retryAfterSeconds()]);
}Zdieľaný rozpočet medzi workermi
Limiter predvolene používa úložisko v pamäti — pre každý proces zvlášť, čo stačí pre jeden worker alebo CLI beh. Pre rozpočet zdieľaný medzi workermi fronty alebo servermi nasmerujte úložisko podkladového balíka na Cache, Redis alebo databázu (HTTP_CLIENT_RATE_LIMITS_STORE); tento balík úložisko nevnucuje:
// config/http-client-rate-limits.php — published by the rate-limits package
'store' => RoundlyConsulting\HttpClientRateLimits\Store\RedisStore::class,Čo sa započítava
Cez limiter prechádzajú operácie so zdrojmi, požiadavky na logy, sledovanie zmien, priame volania request() aj kubernetes:ping; spojenia exec nie a pod Kubernetes::fake() nič. Nastavením KUBERNETES_RATELIMIT_ENABLED=false získate klienta úplne bez obmedzenia.
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.