Saltar al contenido

Limitación de tasa

Queuety admite la limitación de tasa por controlador para evitar sobrecargar las API externas u otros recursos limitados. Cuando un controlador alcanza su límite, los trabajadores dejan sus trabajos pendientes y los recogen de nuevo cuando la ventana vuelve a tener capacidad.

Configurar un límite de tasa

Aplique un límite de tasa al enviar un trabajo:

PHP
use Queuety\Queuety;

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

Los dos argumentos son:

  1. $max - Número máximo de ejecuciones permitidas en el intervalo
  2. $window - Duración del intervalo en segundos

Un límite establecido al despachar solo se registra en el proceso PHP que despacha el trabajo. Un trabajador que se ejecute en un proceso aparte, como wp queuety work, no lo verá, así que establezca en config() del controlador los límites que deban aplicarse a todos los procesos, como se muestra a continuación (#3).

Límites de tasa por controlador

Establezca límites de tasa en el método config() del controlador para que se apliquen a cada envío:

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

Cómo funciona

Los límites de tasa se registran por nombre de controlador. Después de reclamar un trabajo, el trabajador registra el límite del controlador (de su config()) y consulta el limitador de tasa. Si el controlador ha alcanzado su límite, el trabajador devuelve el trabajo directamente a pending sin demora y sin consumir un intento, y luego espera QUEUETY_WORKER_SLEEP segundos antes de volver a consultar. En cambio, un trabajador iniciado con --once se cierra.

Cada trabajador mantiene un contador en memoria y lo actualiza cada 5 segundos desde la tabla queuety_logs, contando las entradas de registro completed del controlador de los últimos $window segundos. Como el recuento procede de la tabla de registros compartida (y de la caché compartida, si se configura), los límites por controlador se aplican a todos los procesos de trabajo, no solo a uno. Las ejecuciones fallidas no cuentan para el límite.

Acceso mediante código

Acceda directamente al limitador de tasa:

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() y is_limited() actúan sobre el limitador del proceso PHP actual. Registrar aquí un límite no cambia lo que aplica un trabajador que se ejecuta por separado.

Casos de uso

  • Límites de API externos. Adapte el límite de tasa a la cuota de API (e.g., 60 solicitudes por minuto de OpenAI).
  • Control del envío de correos. Evite enviar demasiados correos en poco tiempo.
  • Protección de recursos. Limite los controladores que consumen mucha CPU para evitar que acaparen recursos en detrimento de otros trabajos.