تحديد معدل الطلبات
يدعم Queuety تحديد معدل الطلبات لكل معالج لمنع زيادة الضغط على واجهات API الخارجية أو الموارد الأخرى محدودة السعة. عندما يبلغ معالج حدّه، يترك العمال مهامه معلقة ثم يستلمونها مجددًا عندما تتسع النافذة.
تعيين حد للمعدل
طبّق حدًا للمعدل عند إرسال مهمة:
use Queuety\Queuety;
Queuety::dispatch( 'call_openai', $payload )
->rate_limit( 10, 60 ); // max 10 executions per 60 seconds
المعاملان هما:
$max- الحد الأقصى لعدد مرات التنفيذ المسموح بها في النافذة$window- مدة النافذة بالثواني
يُسجل الحد المحدد وقت الإرسال في عملية PHP التي ترسل المهمة فقط. ولا يراه العامل الذي يعمل في عملية منفصلة، مثل wp queuety work؛ لذا عيّن الحدود التي يجب أن تسري عبر العمليات في config() الخاص بالمعالج كما هو موضح أدناه (#3).
حدود المعدل على مستوى المعالج
عيّن حدود المعدل في طريقة config() الخاصة بالمعالج لتُطبق على كل عملية إرسال:
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 ثانية. وبما أن العدد يأتي من جدول السجلات المشترك (ومن الذاكرة المؤقتة المشتركة عند إعدادها)، تُفرض حدود المعالج على جميع عمليات العمال، لا على عامل واحد فقط. ولا تُحتسب عمليات التنفيذ الفاشلة ضمن الحد.
الوصول البرمجي
يمكنك الوصول إلى محدد المعدل مباشرةً:
$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 طلبًا في الدقيقة من OpenAI).
- تقييد إرسال البريد الإلكتروني. امنع إرسال عدد كبير جدًا من الرسائل خلال فترة قصيرة.
- حماية الموارد. حدّ من المعالجات كثيفة استخدام CPU لمنعها من حرمان المهام الأخرى من الموارد.