Към съдържанието

Ограничаване на честотата

Queuety поддържа ограничаване на честотата за всеки обработчик, за да предотврати претоварване на външни API или други ограничени ресурси. Когато обработчик достигне лимита си, работниците оставят задачите му в изчакване и ги поемат отново, когато в прозореца се освободи място.

Задаване на ограничение на честотата

Прилагайте ограничение на честотата при изпращане на задача:

PHP
use Queuety\Queuety;

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

Двата аргумента са:

  1. $max - Максимален брой изпълнения в рамките на прозореца
  2. $window - Продължителност на прозореца в секунди

Ограничение, зададено при изпращането, се регистрира само в процеса PHP, който изпраща задачата. Работник в отделен процес, например wp queuety work, не го вижда, затова задавайте ограниченията, които трябва да важат между процесите, в config() на обработчика, както е показано по-долу (#3).

Ограничения на честотата на ниво обработчик

Задавайте ограничения на честотата в метода config() на обработчика, за да важат при всяко изпращане:

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
        ];
    }
}

Как работи

Ограниченията на честотата се проследяват по име на обработчик. След като поеме задача, работникът регистрира ограничението на обработчика (от неговия config()) и проверява ограничителя на честотата. Ако обработчикът е достигнал лимита си, работникът връща задачата директно в pending без забавяне и без да изразходва опит, след което изчаква QUEUETY_WORKER_SLEEP секунди преди следващото запитване. Вместо това работник, стартиран с --once, се прекратява.

Всеки работник поддържа брояч в паметта и го обновява на всеки 5 секунди от таблицата queuety_logs, като брои записите в журнала completed за обработчика през последните $window секунди. Тъй като броят идва от споделената таблица с журнали (и от споделения кеш, когато е конфигуриран), ограниченията на ниво обработчик важат за всички работни процеси, а не само за един работник. Неуспешните изпълнения не се броят към лимита.

Програматичен достъп

Достъпвайте ограничителя на честотата директно:

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() и is_limited() действат върху ограничителя в текущия процес PHP. Регистрирането на ограничение тук не променя това, което прилага отделно работещ работник.

Случаи на употреба

  • Ограничения на външни API. Съобразете ограничението на честотата с квотата на API (e.g. например, 60 RPM на OpenAI).
  • Ограничаване на имейли. Предотвратете изпращането на твърде много имейли за кратък период.
  • Защита на ресурсите. Ограничете обработчиците с интензивно използване на процесора, за да не лишават други задачи от ресурси.