
# Ā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:

```php
use Queuety\Queuety;

Queuety::dispatch( 'call_openai', $payload )
    ->rate_limit( 10, 60 ); // max 10 executions per 60 seconds
```

Abi argumenti ir:
1. `$max` — maksimālais atļautais izpildes reižu skaits periodā
2. `$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](https://github.com/inline0/queuety/issues/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:

```php
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:

```php
$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.
