ليه نحط حد للريكوستات؟
الـ 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 | عدّاد الشباك الحالي + نسبة من الشباك اللي فات حسب التداخل | ناعم وموفر. تقريبي |
المعمارية
Client
Rate Limitermiddleware
RedisINCR + EXPIRE
API Servers
العدادات في 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.