عندما ترجع API أو خدمة ويب 429، كثير من العملاء يعيدون الطلب مباشرة عدة مرات. النتيجة ضغط إضافي واحتمال حظر أطول. الخادم قد يرسل Retry-After بالثواني أو تاريخ HTTP. العميل الجيد يحترمها ويضيف حدودًا على عدد المحاولات والزمن الإجمالي.
اقرأ Retry-After بشكل صحيح
قد تكون القيمة عدد ثوان أو HTTP-date. parse بحذر وإذا غابت استخدم exponential backoff افتراضيًا. لا تسمح لقيمة شاذة أن تعلق job بلا نهاية؛ طبق max delay policy.
أضف jitter
لو ألف worker تلقوا نفس Retry-After وعادوا بنفس اللحظة، تحدث موجة جديدة. أضف random jitter حول التأخير ضمن حدود معروفة لتوزيع العودة.
احترم Budget
إذا المهمة لها deadline أقرب من retry time، لا تنتظر ثم تفشل لاحقًا. أعد status واضحًا أو schedule job مستقبلية. فرق interactive request عن background job.
خطوات عملية
- parse delay.
- apply cap.
- add jitter.
- compare deadline.
راقب Scope الحد
Rate limit قد يكون per token أو IP أو account أو endpoint. retries عبر workers مختلفة قد تشترك في نفس الحد. استخدم coordination أو bucket مشترك عند الحاجة.
استفد من Headers إضافية
بعض APIs ترسل remaining/reset headers. تعامل معها كإشارات لا معيار عالمي؛ أسماءها تختلف. لا تبنِ client عام على header خاص بدون abstraction.
قِس 429 rate
زيادة 429 تعني أن throughput policy لا تناسب الخدمة. الحل طويل الأجل قد يكون تقليل concurrency أو batching، لا retry أذكى فقط.
قائمة مراجعة
- 429 per minute.
- endpoint.
- credential scope.
- retry success rate.
نسّق Rate Limit بين Workers بدل Backoff محلي فقط
في نظام موزع، كل Worker قد يحترم Retry-After منفردًا بينما إجمالي الطلبات عبر نفس API token أو IP يظل يتجاوز الحد. استخدم shared limiter أو token bucket مركزيًا عندما يكون scope مشتركًا، أو عيّن owner واضحًا لكل credential. سجل remaining/reset headers إن كانت الخدمة توفرها، لكن لا تعتمد على أسماء غير قياسية دون abstraction. عندما يكون Retry-After طويلًا، أعد job إلى Queue/Scheduler بموعد مستقبلي بدل إبقاء Worker نائمًا. عند الاستيقاظ تحقق أن المهمة لم تُلغ وأن deadline ما زال يسمح بالتنفيذ. هذه البنية تعالج أصل المشكلة: معدل المجموعة لا محاولة واحدة.
قائمة مراجعة
- اعرف scope للحد.
- Limiter مشترك عند الحاجة.
- Long delay يتحول إلى reschedule.
- Metrics حسب token/IP/endpoint.
قِس Fairness بين العملاء
Limiter global قد يجعل عميلًا كثيفًا يستهلك quota ويحرم بقية المستخدمين. إذا API limit تسمح، ضع budgets فرعية per workspace أو job priority مع سقف إجمالي. راقب wait time حسب الفئة لا throughput فقط. هذا يمنع نظامًا يلتزم بمعدل المزود لكنه يقدم تجربة غير عادلة داخليًا.
من المثال إلى تطبيق يمكن صيانته
في «HTTP 429 عمليًا: كيف تبني Backoff يحترم Retry-After» جرّب الحل على حالة صغيرة ثم أضف failure path واضحًا واختبارًا آليًا يحمي السلوك المتوقع. حدّد contract للمدخلات والمخرجات، وتعامل مع القيم الناقصة قبل الوصول إلى طبقة التنفيذ. إذا كان الحل يتعامل مع API أو ملف أو DOM، أضف logging مختصرًا يوضح المرحلة وكود الخطأ دون بيانات حساسة. بعد ذلك اختبر التوافق مع نسخة سابقة أو بيئة مختلفة. هذه الخطوات تجعل المثال مفيدًا في مشروع حقيقي بدل أن يبقى snippet يعمل فقط في المسار المثالي.
قائمة مراجعة
- Contract للمدخلات والمخرجات.
- اختبار failure path.
- رسائل خطأ قابلة للتشخيص.
- Regression test قبل الدمج.
شارك في تقييم ونقاش المقال
رأيك يضيف قيمة للمقال ويساعدنا على تحسين المحتوى والنقاش حوله.
النقاش
جارٍ تحميل التعليقات…