Ātruma ierobežošana
Queuety atbalsta ātruma ierobežojumus katram apdarinātājam, lai novērstu ārējo API vai citu ierobežotu resursu pārslogošanu. Kad apdarinātājs sasniedzis limitu, darbinieki atstāj tā darbus gaidīšanas režīmā un paņem tos, tiklīdz periodā ir brīva vieta.
Ātruma limita iestatīšana
Iestatiet ātruma limitu, nosūtot darbu:
use Queuety\Queuety;
Queuety::dispatch( 'call_openai', $payload )
->rate_limit( 10, 60 ); // max 10 executions per 60 seconds
Abi argumenti ir:
$max— maksimālais atļautais izpildes reižu skaits periodā$window— perioda ilgums sekundēs
Nosūtīšanas laikā iestatītais limits tiek reģistrēts tikai PHP procesā, kas nosūta darbu. Atsevišķā procesā palaists darbinieks, piemēram, wp queuety work, to neredz, tāpēc procesiem kopīgi piemērojamos limitus iestatiet apdarinātāja config(), kā parādīts tālāk (#3).
Ātruma limiti apdarinātāja līmenī
Iestatiet ātruma limitus apdarinātāja metodē config(), lai tie attiektos uz katru nosūtīto darbu:
use Queuety\Handler;
class CallOpenAIHandler implements Handler {
public function handle( array $payload ): void {
// Call the API...
}
public function config(): array {
return [
'rate_limit' => [ 60, 60 ], // 60 requests per minute
];
}
}
Kā tas darbojas
Ātruma limiti tiek uzskaitīti katram apdarinātāja nosaukumam. Pēc darba paņemšanas darbinieks reģistrē apdarinātāja limitu (no tā config()) un pārbauda ātruma ierobežotāju. Ja apdarinātājs ir sasniedzis limitu, darbinieks nekavējoties ievieto darbu atpakaļ pending bez aiztures un nepatērējot mēģinājumu, pēc tam nogaida QUEUETY_WORKER_SLEEP sekundes un atkal pārbauda, vai ir darbi. Tā vietā tiek izbeigts darbinieks, kas palaists ar --once.
Katrs darbinieks uztur skaitītāju atmiņā un ik pēc 5 sekundēm atsvaidzina to no tabulas queuety_logs, uzskaitot apdarinātāja completed žurnāla ierakstus pēdējo $window sekunžu laikā. Tā kā skaits tiek iegūts no koplietotās žurnālu tabulas (un koplietotās kešatmiņas, ja tā ir konfigurēta), apdarinātāja līmeņa limiti tiek piemēroti visos darbinieku procesos, nevis tikai vienā darbiniekā. Neveiksmīgas izpildes netiek ieskaitītas limitā.
Programmatiska piekļuve
Piekļūstiet ātruma ierobežotājam tieši:
$limiter = Queuety::rate_limiter();
// Register a rate limit
$limiter->register( 'call_openai', 60, 60 );
// Check whether a handler has reached its limit
$limited = $limiter->is_limited( 'call_openai' ); // true while the limit is reached
// Seconds until the current window resets
$wait = $limiter->time_until_available( 'call_openai' );
register() un is_limited() darbojas ar ierobežotāju pašreizējā PHP procesā. Limita reģistrēšana šeit nemaina to, ko piemēro atsevišķi palaists darbinieks.
Lietojuma gadījumi
- Ārējo API limiti. Pielāgojiet ātruma limitu API kvotai (e.g., OpenAI 60 RPM).
- E-pasta sūtīšanas ierobežošana. Novērsiet pārāk daudzu e-pasta ziņojumu nosūtīšanu īsā laikā.
- Resursu aizsardzība. Ierobežojiet procesora ietilpīgus apdarinātājus, lai tie neatņemtu resursus citiem darbiem.