الأساسيات · فصل ٤

تصميم Rate Limiter

Rate limiter · token bucket · Redis · 429
🎯 الهدف: تحط حد للريكوستات من غير ما تبوّظ اليوزر العادي، وتختار خوارزمية وتعرف تحطها فين.

ليه نحط حد للريكوستات؟

الـ Rate Limiter بيتحكم في عدد الريكوستات اللي يوزر أو IP يبعتها في فترة معينة، والزيادة بتترفض. زي البواب اللي بيدّخل عدد محدد في الدقيقة.

بيعمل إيه
  • يحمي السيرفرات من الضغط.
  • يقلل التكلفة، خصوصًا APIs مدفوعة.
  • يمنع شكل من أشكال الـ DoS.
المتطلبات

دقة في الحد، latency قليلة، ميموري قليلة، يشتغل على كذا سيرفر (distributed)، رسالة واضحة لليوزر، ولو الـ limiter وقع السيستم يكمل.

نحطه فين؟

الـ client مش مضمون — أي حد يعدّل عليه. الأحسن على السيرفر، أو كـ middleware، أو جوه الـ API Gateway لو عندك microservices.

الخوارزميات الخمسة

الخوارزميةالفكرةالحكم
Token Bucketجردل فيه tokens بيتملى بمعدل ثابت. كل ريكوست بياخد token؛ مفيش؟ يترفض. عندك bucket size و refill rateبسيط وبيسمح بـ burst. ضبط البرامترز محتاج تجربة
Leaking Bucketطابور FIFO بيخرج منه ريكوستات بمعدل ثابت. الطابور اتملى؟ رفضخرج ثابت. الـ burst بيملاه بريكوستات قديمة
Fixed Windowتقسم الوقت لشبابيك ثابتة وتعد في كل شباكسهل. ممكن يحصل spike على حدود الشباك يعدّي ضعف الحد
Sliding Window Logتخزن timestamp كل ريكوست (مثلًا Redis sorted set) وتمسح القديمدقيق جدًا. بياكل ميموري
Sliding Window Counterعدّاد الشباك الحالي + نسبة من الشباك اللي فات حسب التداخلناعم وموفر. تقريبي

المعمارية

العدادات في Redis لأنه سريع وفيه INCR و EXPIRE. القواعد (rules) في config files، و workers بيحملوها في الكاش.

اترفض؟ رجّع 429 Too Many Requests مع headers زي X-Ratelimit-Remaining و X-Ratelimit-Limit و X-Ratelimit-Retry-After. ممكن كمان تحط الريكوست في queue يتعالج بعدين.

في الـ wrap up

  • Hard: ممنوع تعدّي الحد. Soft: تعدّي شوية لفترة قصيرة.
  • ممكن تعمل limit في طبقات تانية، زي IP عن طريق iptables.
  • على الـ client: استخدم cache، و backoff في الـ retry عشان متعملش هجوم على نفسك.

Checklist الـ Rate Limiter

🧠 اختبر نفسك
١) ليه متحطش الـ rate limiter على الـ client بس؟
لأن أي حد يقدر يعدّل على الأبلكيشن ويتجاوز الحد.
٢) إيه عيب الـ Fixed Window؟
على حدود الشباك، دفعة في آخر شباك ودفعة في أول الشباك اللي بعده يعدّوا ضعف الحد.
٣) ليه Redis مش ميموري السيرفر؟
عشان كل السيرفرات تشوف نفس العداد. ميموري السيرفر بتخلي كل ماكينة تعد لوحدها.
٤) اتنين طلبوا INCR في نفس اللحظة والعداد عدّى الحد. اسم المشكلة إيه؟
Race condition. بتتحل بـ Lua script أو عملية atomic على Redis.