محددات معدل التصميم
1) لماذا الحد من المعدل
يحمي الحد من الأسعار توافر واجهات برمجة التطبيقات واقتصادياتها: توقف الفيضانات، ودفعات إعادة التدوير، وحشو أوراق الاعتماد، وتحمي العمليات باهظة الثمن (المعاملات المالية، وتوليد التقارير)، ويخفف العبء على الأنظمة المعتمدة (قواعد البيانات/مقدمي الخدمات). يعطي التصميم الجيد الإنصاف والقدرة على التنبؤ بزمن الكمون والمنظمات المحدودة الواضحة.
الأهداف الرئيسية
استقرار RPS وحماية العبء الزائد الخلفي.
«المرونة» الخاضعة للرقابة (بدل الانفجار).
تمييز العملاء (لكل مستخدم/منظمة/لكل مفتاح/لكل شريك/منطقة).
نموذج القيمة: «أسعار» مختلفة للمعاملات المختلفة.
2) أنواع الحدود
حدود RPS: الطلبات في الثانية/الدقيقة.
الحصص: مجموع الميزانية لكل فترة (يوم/شهر).
القدرة التنافسية: العمليات المتزامنة (الخروج، العمل الشاق).
معدل/شريط بايت/ثانية (حمل/تفريغ).
الحدود المرجحة: «تكلفة» الطلب حسب التعقيد (على سبيل المثال، تعقيد الرسم البياني QL، حجم الدفعة).
التكيف: يتم تشديده في حالة حدوث حالات شاذة (نشاط/أخطاء مشبوهة 401/403/5xx).
3) الخوارزميات ومتى يتم تطبيقها
3. 1 نافذة ثابتة
بسيطة: عداد لكل فترة (على سبيل المثال 100 ر/دقيقة).
الإيجابيات: الحد الأدنى للتكلفة. السلبيات: «انفجارات حافة» على حدود النافذة.
الزمان: لوحات إدارية، دقة منخفضة، تكلفة منخفضة.
3. 2 نافذة منزلقة (سجل/عداد)
سجل - يخزن الطوابع الزمنية للطلبات الحديثة، دقيقة ومكلفة في الذاكرة.
العداد: متوسط نافذتين متجاورتين (متداول)، وهو حل وسط للدقة والسعر.
عندما: واجهات برمجة التطبيقات العامة لحركة المرور المتوسطة، فأنت بحاجة إلى النعومة بدون الرياضيات المعقدة.
3. 3 دلو رمزي
البارامترات: معدل 'r' (رمز/ثانية) وسعة 'b' (انفجار). كل طلب «يحرق» الرمز.
الإيجابيات: بدل الانفجار الطبيعي، التنفيذ البسيط. السلبيات: لا يوجد تكافؤ صارم.
متى: دائمًا تقريبًا لـ RPS، إذا كانت هناك حاجة إلى «وابل» داخل 'b'.
3. 4 دلو متسرب (بالتنقيط)
قائمة الانتظار التي «تتسرب» منها بسرعة ثابتة.
الإيجابيات: حتى تدفق الإخراج. السلبيات: المزيد من التأخير.
الزمان: التيسير على مقدمي الخدمات الخارجيين «الهشين».
3. 5 GCRA (خوارزمية معدل الخلية المعمم)
نموذج وقت الوصول النظري (TAT):- 'TAT _ next = max (TAT_current، الآن) + 1/r'، يتم قبول الطلب إذا 'الآن <= TAT_current + burst/r'.
- الإيجابيات: ذاكرة صارمة ودقيقة وقليلة (احتفظ بـ TAT حسب المفتاح). السلبيات: يصعب فهمها.
متى: بحاجة إلى مراقبة صارمة وسلاسة، حدود موزعة.
3. 6 سيمافورات تنافسية
مكافحة العمليات النشطة ؛ الدخول - إذا كانت هناك «تذاكر» ؛ الخروج - الإفراج.
الزمان: عمليات طويلة الأمد، خيوط، WebSocket، تنزيلات.
4) حد النموذج الرئيسي
المفتاح = مزيج السمة:- 'lient _ id '/' api _ key '/' user _ id '/' org _ id'
- «IP/ASN/geo» (حماية تقريبية)
- «نقطة النهاية/الطريقة» (الطرق الساخنة)
- 'scope/plan/tier' (تحقيق الدخل)
- «الفراغ _ المفتاح» (عمليات الكتابة)
- استخدم التسلسل الهرمي: أولاً صارم لكل مفتاح، ثم لكل منظمة، ثم عالمي.
5) نموذج التكلفة
تعريف «التكلفة» 'التكلفة (ف)':- الرسم البياني QL: التعقيد الميداني × العمق.
- REST: حجم الاستجابة/الطلب، نوع العملية (اقرأ = 1، الكتابة = 3، التقرير = 10).
- الدفعة: «التكلفة = دقيقة (ن، غطاء)».
- نحن نحد من الرموز وليس «الطلبات»: «الميزانية - = التكلفة (ف)».
6) التنفيذ الموزع
6. 1 خزائن
قيد التشغيل: فائق السرعة، ولكن ليس حدًا عامًا (مناسبًا للحدود «اللينة» المحلية).
Redis: المعيار الفعلي. INCR/EXPIRE، Lua scripts (atomicity)، ZSET للنافذة المنزلقة، المفاتيح مع TTL.
المبعوث/NGINX/Kong/Traefik: مرشحات مدمجة ؛ ملائمة للمحيط.
شبكة الخدمة: حدود محلية للمزامنة الجانبية + العالمية.
6. 2 الذرة والسباق
Lua in Redis: التحقق والتدرج في خطوة واحدة.
GCRA: تخزين TAT واحد مع CAS/script.
اتساق الساعة: NTP، مؤقتات رتيبة.
الشحن: تجزئة ثابتة حسب المفتاح ؛ تجنب الشظايا «الساخنة».
6. 3 التوزيع الجغرافي
الحدود المحلية على المجموعات الإقليمية + العالمية العليا (خشنة).
CRDT/تكرار - حذر (التأخير، الاستهلاك المزدوج). الحدود الإقليمية ذات الهامش هي الأفضل.
7) السياسات وتحديد الأولويات
الخطط: Free/Pro/Enterprise مع حصص مختلفة «r» و «b».
الأولويات: تحصل الطرق «باهظة الثمن» على حد أقل أو تكلفة أكبر.
القوائم: قائمة السماح بالدمج، يرفضها ASN/proxy/TOP.
التصعيد: إذا تجاوزته مرة أخرى، اخفض الحد، أدخل إثبات العمل/الكابتشا/التحديات.
8) أمثلة على التكوينات
8. 1 مبعوث (مرشح حد معدل HTTP، زائف)
yaml rate_limit:
domain: public-api descriptors:
- key: api_key rate_limit:
unit: second requests_per_unit: 50 burst: 100
- key: api_key value: payments. write rate_limit:
unit: second requests_per_unit: 5 burst: 10
8. 2 NGINX (لوا + ريديس، زائف)
nginx lua_shared_dict limits 10m;
location /api/ {
access_by_lua_block {
local key = ngx. var. arg_apikey.. ":".. ngx. var. request_method.. ":".. ngx. var. uri
-- token bucket in Redis (evalsha)
local allowed, retry_after = ratelimit_allow(key, 50, 100) -- r=50/s, b=100 if not allowed then ngx. header["Retry-After"] = retry_after return ngx. exit(429)
end
}
proxy_pass http://backend;
}
8. 3 حدود تنافسية (رمز زائف)
pseudo on_request_start(key):
if redis. incr_with_ttl("sem:" + key, ttl=60) > MAX_CONCURRENCY:
redis. decr("sem:" + key); reject(429)
on_request_finish(key):
redis. decr("sem:" + key)
8. 4 GCRA (pseudocode)
pseudo params: r tokens/sec, burst b tat = redis. get(key) or now allowed_time = tat - (b / r)
if now < allowed_time: reject(429, retry_after = allowed_time - now)
tat_next = max(tat, now) + 1/r redis. set(key, tat_next, ttl = ceil(b/r) + safety)
9) التكامل مع إعادة التصوير والوقت وقاطع الدائرة
إعادة الميزانية: قصر حصة عمليات إعادة التدوير على X٪ من حركة المرور الرئيسية.
Jitter: عندما تتراجع، أضف دائمًا رعشة - يقلل من الرشقات المتزامنة.
قاطع الدائرة: إذا كان هناك خطأ مرتفع («5xx»، فتخفيض الحدود أو نقل بعض الطرق إلى «القراءة فقط».
التحوط: أنيق ؛ ضع في اعتبارك التكلفة لتجنب مضاعفة ميزانيتك.
10) إمكانية الرصد والإدارة
Метрики: «rps _ مسموح»، «rps _ blocked»، «429 _ rate»، «retry _ after _ avg»، «burst _ used»، «conta _ restaining»، «active _ concurrency».
الملصقات: حسب المفتاح الحدي، المنطقة، نقطة النهاية، الخطة.
سجلات القرار (أخذ عينات): سبب الفشل، العدادات الحالية، TTL الرئيسية.
لوحات القيادة: بطاقات الحرارة حسب المفاتيح/نقاط النهاية، العملاء «الساخنون».
التنبيهات: نمو 429> 2-5٪ على الطرق الحرجة، «استنفاد» متكرر للحصص، اختلال توازن الشظايا.
11) الاختبار والتحقق
اختبارات العقود للسياسات (الجداول إن وجدت).
التحميل: رشقات نارية (x10 من r)، هضاب طويلة، أنماط «قذرة» (بطيئة البريد، وصلات طويلة).
حركة الفوضى: تيارات غير متساوية، انجراف الساعة، Redis/قطرة الشبكة.
إدراج A/B: حدود طرح الكناري، حلول الظل (سجل، ولكن لا تحجب) قبل الإدراج.
12) حالات الحافة والتفاصيل الدقيقة
انحراف الساعة: استخدم «الآن ()» من مصدر واحد (خادم)، وليس من رؤوس العملاء.
Idempotency-Key: للكتابة - يقلل من التضخيم في retras.
عمليات الدفعات: الحد من حجم الدفعة والتكلفة الإجمالية.
استطلاع طويل/WebSocket: حد من عدد القنوات/الاشتراكات والمدة.
البداية الباردة: بداية «دافئة» للعدادات/التحميل المسبق ؛ خلاف ذلك، رشقات نارية زائفة من 429.
الطلبات باهظة الثمن من الناحية الحسابية: الحد من تنفيذ منطق الأعمال التجارية.
يجب أن تغطي حدود TTL: TTL للمفاتيح النافذة + هامش الأمان.
13) تصعيد مضادات الروبوت
المراحل: تحذير → 429 + تحدي → «إعادة المحاولة بعد» (كابتشا/أحجية) → كتلة مؤقتة.
الإشارات: بصمة الجهاز، المؤشر/سلوك التوقيت، TOR/proxy/hosting.
يجب أن تكون السياسات حتمية وقابلة للتكرار للطب الشرعي.
14) السلامة والامتثال
الرفض الافتراضي للطرق الحرجة (الكتابة/التمويل).
مراجعة الحسابات: إبقاء القرارات بشأن حدود القضايا التنظيمية ومراجعة الحوادث.
PII: يجب ألا تكشف مفاتيح الحدود عن البيانات الشخصية في السجلات.
15) قائمة التحقق من الاستعداد
- يتم تحديد مفاتيح الحدود ونموذج التكلفة.
- خوارزمية مختارة (دلو رمزي/GCRA) وتخزين (Redis/gateway).
- سياسات العملاء من الدرجة الأولى + الصمامات العالمية.
- حدود تنافسية للمعاملات الطويلة الأجل.
- إعادة الميزانية، التراجع مع النبض، التكامل مع قاطع الدائرة.
- لوحات/تنبيهات، سجلات قرارات مأخوذة من عينات.
- وضع الكناري والظل.
- اختبارات الرشقات النارية، الهضاب الطويلة، فشل Redis، انحراف الساعة.
- وثائق العملاء: 429، رموز «Retry-After»، أمثلة تراجعية أسية.
16) TL ؛ د
استخدم دلو رمزي أو GCRA مع Redis/gateway، ومفاتيح حدود التصميم وتكاليف الطلب، وإضافة إشارات تنافسية للعمليات الطويلة، والاندماج مع ميزانية إعادة التجربة وقاطع الدائرة، ومراقبة 429 و «سعة الانفجار»، وطرح حدود عبر الكناري/الظل وتأكد من اختبار الانفجارات وفشل التخزين