Limitation du débit
Queuety prend en charge la limitation du débit par gestionnaire afin d’éviter de surcharger les API externes ou d’autres ressources limitées. Lorsqu’un gestionnaire atteint sa limite, les workers laissent ses tâches en attente et les reprennent dès que la fenêtre le permet.
Définir une limite de débit
Appliquez une limite de débit lors de la distribution d’une tâche :
use Queuety\Queuety;
Queuety::dispatch( 'call_openai', $payload )
->rate_limit( 10, 60 ); // max 10 executions per 60 seconds
Les deux arguments sont :
$max- Nombre maximal d’exécutions autorisées dans la fenêtre$window- Durée de la fenêtre en secondes
Une limite définie lors de la distribution est enregistrée uniquement dans le processus PHP qui distribue la tâche. Un worker exécuté dans un processus distinct, comme wp queuety work, ne la voit pas. Définissez donc dans config() du gestionnaire les limites qui doivent s’appliquer à tous les processus, comme indiqué ci-dessous (#3).
Limites de débit au niveau du gestionnaire
Définissez les limites de débit dans la méthode config() du gestionnaire pour qu’elles s’appliquent à chaque distribution :
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
];
}
}
Fonctionnement
Les limites de débit sont suivies par nom de gestionnaire. Après avoir pris une tâche, le worker enregistre la limite du gestionnaire (depuis son config()) et vérifie le limiteur de débit. Si le gestionnaire a atteint sa limite, le worker remet immédiatement la tâche dans pending, sans délai et sans consommer de tentative, puis attend QUEUETY_WORKER_SLEEP secondes avant de vérifier à nouveau. Un worker démarré avec --once s’arrête à la place.
Chaque worker conserve un compteur en mémoire et le met à jour toutes les 5 secondes à partir de la table queuety_logs, en comptant les entrées de journal completed du gestionnaire au cours des $window dernières secondes. Comme le décompte provient de la table de journaux partagée (et du cache partagé, s’il est configuré), les limites définies au niveau du gestionnaire s’appliquent à tous les processus workers, et pas seulement à un seul worker. Les exécutions échouées ne sont pas comptabilisées dans la limite.
Accès programmatique
Accédez directement au limiteur de débit :
$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() et is_limited() agissent sur le limiteur dans le processus PHP actuel. Définir une limite ici ne modifie pas celle appliquée par un worker exécuté séparément.
Cas d’utilisation
- Limites d’API externe API. Adaptez votre limite de débit au quota de API (par ex. e.g, 60 RPM pour OpenAI).
- Limitation des e-mails. Évitez d’envoyer trop d’e-mails sur une courte période.
- Protection des ressources. Limitez les gestionnaires gourmands en processeur pour éviter qu’ils ne privent les autres tâches de ressources.