Skip to content

تحديد المعدل والتحكم في الضغط العكسي

مقدمة

في منتصف ليلة الحادي عشر من نوفمبر، مئات الملايين من المستخدمين يتدفقون في وقت واحد -- هل يمكن للخوادم التحمل؟ كل نظام له حد لقدرة المعالجة. عندما يتجاوز حجم الطلبات قدرة تحميل النظام، بدون تحكم، النتيجة هي أن لا أحد يستطيع الاستخدام. تحديد المعدل والضغط العكسي هما خطا الدفاع اللذان يحميان النظام من "الانهيار".

ماذا ستتعلم في هذا المقال؟

بعد إكمال هذا الفصل، ستكتسب:

  • ضرورة تحديد المعدل: فهم لماذا من الضروري رفض بعض الطلبات بنشاط لحماية النظام
  • خوارزميات التحديد: إتقان مبادئ واختلافات ثلاث خوارزميات أساسية: دلو الرموز، الدلو المتسرب، والنافذة المنزلقة
  • آلية الضغط العكسي: فهم استراتيجيات المعالجة عندما تتجاوز سرعة المنبع سرعة المصب
  • التحديد متعدد الطبقات: التعرف على بنية التحديد متعدد الطبقات من العميل إلى البوابة والخدمة
  • القدرة العملية: معرفة أي استراتيجية تحديد تختار في أي سيناريو
الفصلالمحتوىالمفهوم الأساسي
الفصل 1لماذا نحتاج تحديد المعدلتأثير الانهيار، حماية الخدمات
الفصل 2خوارزميات التحديددلو الرموز، الدلو المتسرب، النافذة المنزلقة
الفصل 3التحكم في الضغط العكسيالمخزن المؤقت، استراتيجية التجاهل، التوسع المرن
الفصل 4بنية التحديد متعدد الطبقاتالعميل، البوابة، الخادم
الفصل 5الممارسة والاختيارNginx، Redis، Sentinel

0. نظرة عامة: لماذا "نرفض" المستخدمين؟

يبدو هذا متناقضًا -- ألا يجب أن نخدم كل مستخدم بشكل جيد؟ لكن الواقع هو: إذا لم تُرفض بعض الطلبات، ستفشل جميع الطلبات.

تخيل مطعمًا يتسع لـ 100 شخص فقط، وفجأة يدخل 1000 شخص. بدون تحديد، النتيجة ليست أن الـ 1000 يستطيعون الأكل، بل أن المطبخ ينهار والنادلين يشلون، ولا أحد يستطيع الأكل. الحل الصحيح هو الطابور والتحديد عند المدخل، leaving 100 يدخلون أولاً، بينما الباقي ينتظرون.

الهدف الأساسي لتحديد المعدل

  • حماية النظام: منع الحمل الزائد من التسبب في عدم توفر الخدمة بالكامل
  • التوزيع العادل: ضمان معالجة الطلبات المقبولة بشكل طبيعي
  • التدهور الأنيق: الطلبات المحددة تتلقى رمز حالة 429 واضح، بدلاً من انتهاء المهلة أو خطأ 500

1. خوارزميات التحديد: ثلاثة حلول كلاسيكية

المشكلة الأساسية للتحديد هي: كم عدد الطلبات المسموح بمرورها كحد أقصى في وحدة زمنية؟ الخوارزميات المختلفة لها مقايضات مختلفة في الدقة، ومعالجة حركة المرور المفاجئة، وتعقيد التنفيذ.

Rate Limiting Algorithm Comparison
Choose an algorithm, then send requests to observe the effect
Passed0
Rejected0
Tokens left5
Token bucket
Adds tokens to the bucket at a fixed rate. Each request consumes one token, and extra tokens are discarded when the bucket is full. It allows bursts when stored tokens are available.
الخوارزميةالمبدأحركة المرور المفاجئةالدقةالتعقيد
دلو الرموزإصدار الرموز بمعدل ثابت، الطلبات تستهلك الرموزمسموح (إذا كانت هناك رموز في الدلو)عاليةمتوسطة
الدلو المتسربالطلبات في الطابور، المعالجة بمعدل ثابتغير مسموح (مملس بالكامل)عاليةمتوسطة
النافذة المنزلقةعد الطلبات داخل النافذةمسموح جزئيًاعالية نسبيًامنخفضة
النافذة الثابتةالعد حسب نافذة الوقتقد تحدث مفاجآت عند الحدودمنخفضةالأقل

أي خوارزمية تختار؟

  • تحديد API: دلو الرموز هو الأكثر استخدامًا، يسمح بحركة المرور المفاجئة المعقولة
  • تشكيل حركة المرور: الدلو المتسرب مناسب للسيناريوهات التي تتطلب معدل إخراج ثابت
  • العد البسيط: النافذة المنزلقة سهلة التنفيذ، مناسبة لمعظم تطبيقات الويب

2. التحكم في الضغط العكسي: عندما يكون المنبع أسرع من المصب

يحل التحديد مشكلة "الطلبات الخارجية كثيرة جدًا"، بينما الضغط العكسي (Backpressure) يحل مشكلة "عدم تطابق السرعة بين المكونات الداخلية".

عندما يُنتج المنتج بيانات أسرع مما يمكن للمستهلك معالجتها، يستمر المخزن المؤقت الوسيط في التوسع، مما يؤدي في النهاية إلى فيضان الذاكرة أو فقدان البيانات. تتيح آلية الضغط العكسي للمستهلك "الإخطار العكسي" للمنتج لإبطاء السرعة.

Backpressure Control
What happens when production is faster than consumption?
Produce rate:6/s
Consume rate:3/s
Producer
6/s
Buffer (0/20)
Running normally
Consumer
3/s
Backpressure strategies:
Drop strategy
Drop new data directly when the buffer is full
Example: log collection, real-time metrics
Blocking strategy
Make producers wait when the buffer is full
Example: Go channels, Java BlockingQueue
Sampling strategy
Process only part of the data and skip the rest
Example: downsampling high-frequency sensor data
Elastic scaling
Dynamically increase the number of consumers
Example: Kubernetes HPA autoscaling

أربع استراتيجيات للضغط العكسي

  1. التجاهل (Drop): عندما يكون المخزن المؤقت ممتلئًا، تجاهل البيانات الجديدة أو القديمة، مناسب للسيناريوهات ذات المتطلبات العالية للوقت الفعلي التي تسمح بالفقدان
  2. الحظر (Block): إيقاف المنتج مؤقتًا، انتظار المستهلك لإنهاء المعالجة قبل المتابعة، مناسب للسيناريوهات التي لا يمكن فيها فقدان البيانات
  3. أخذ العينات (Sample): معالجة جزء فقط من البيانات، مناسب لتدفقات البيانات عالية التردد
  4. التوسع المرن (Scale): زيادة عدد المستهلكين ديناميكيًا، مناسب لبيئات السحابة الأصلية

3. بنية التحديد متعدد الطبقات

في بيئات الإنتاج، التحديد في نقطة واحدة غير كافٍ، بل يحتاج إلى حماية متعددة الطبقات، كل طبقة تحل مشاكل بدقة مختلفة.

الطبقةالموقعدقة التحديدالأداة
العميلFrontend/Appمنع اهتزاز الأزرار، throttle الطلباتlodash.throttle، debounce
CDN/WAFعقدة الحافةمستوى IP، مستوى جغرافيCloudflare Rate Limiting
بوابة APIبوابة الدخولمستوى المسار، مستوى المستخدمNginx limit_req، Kong
الخادمداخل التطبيقمستوى endpoint، مستوى الموردSentinel، Resilience4j
قاعدة البياناتطبقة التخزينعدد الاتصالات، QPSتكوين تجمع الاتصالات، صهر الاستعلامات البطيئة

مواصفات HTTP للتحديد

يجب أن تعيد الطلبات المحددة رمز الحالة 429 Too Many Requests، وتتضمن في رؤوس الاستجابة:

  • Retry-After: اقتراح للعميل بالمحاولة مرة أخرى بعد كم من الوقت (بالثواني أو التاريخ)
  • X-RateLimit-Limit: حد المعدل
  • X-RateLimit-Remaining: الحصة المتبقية
  • X-RateLimit-Reset: وقت إعادة تعيين الحصة

4. الاختيار العملي

السيناريوالحل المقترحالوصف
تحديد مدخل Nginxlimit_req_zoneبناءً على خوارزمية الدلو المتسرب، تكوين بسيط
التحديد الموزعRedis + Lua scriptدلو الرموز أو النافذة المنزلقة، مشاركة العد بين المثيلات
Java microservicesSentinel / Resilience4jيدعم الصهر، التدهور، تحديد النقاط الساخنة
API Node.jsexpress-rate-limitسهل الاستخدام، يدعم تخزين Redis
خدمة Gogolang.org/x/time/rateتنفيذ دلو الرموز من المكتبة القياسية

الملخص

تحديد المعدل والضغط العكسي هما خطا دفاع رئيسيان لحماية استقرار النظام. التحديد يتحكم في سرعة تدفق حركة المرور الخارجية، والضغط العكسي ينسق سرعة المعالجة بين المكونات الداخلية.

مراجعة النقاط الرئيسية في الفصل:

  1. ضرورة التحديد: إذا لم تُرفض بعض الطلبات، ستفشل جميع الطلبات
  2. ثلاث خوارزميات أساسية: دلو الرموز (يسمح بالمفاجآت)، الدلو المتسرب (مملس بالكامل)، النافذة المنزلقة (بسيطة ودقيقة)
  3. آلية الضغط العكسي: التجاهل، الحظر، أخذ العينات، التوسع -- أربع استراتيجيات
  4. الحماية متعددة الطبقات: من العميل إلى قاعدة البيانات، كل طبقة تحل مشاكل بدقة مختلفة
  5. مواصفات 429: إرجاع رمز الحالة القياسي ورؤوس التحديد عند التحديد

قراءة إضافية