rate limiterlarni loyihalash
1) Nima uchun rate limiting
Rate limiting APIning ochiqligi va iqtisodiyotini himoya qiladi: fludlarni, retraylarning «burstlari» ni, credential stuffingni to’xtatadi, qimmatbaho operatsiyalarni (pul tranzaksiyalari, hisobotlar ishlab chiqarish) himoya qiladi, qaram tizimlarga (BD/provayderlar) yukni yumshatadi. Yaxshi dizayn adolat, yashirin va aniq SLOlarni beradi.
Asosiy maqsadlar
RPS barqarorligi va ortiqcha yuklashdan himoya qilish.
Boshqariladigan «elastiklik» (burst allowance).
Mijozlarni tabaqalashtirish (per-foydalanuvchi/per-tashkilot/per-kalit/per-IP/per-mintaqa).
Qiymat modeli: turli operatsiyalar uchun turli «narxlar».
2) Limitlar turlari
RPS chegaralari: so’rovlar sekundiga/daqiqaga.
Kvotalar: davrdagi jami budjet (kun/oy).
Raqobatbardoshlik: bir vaqtning o’zida amalga oshiriladigan operatsiyalar (checkout, heavy job).
Tezlik/chiziq: bayt/sek (yuklash/tushirish).
O’lchangan limitlar: murakkablik bo’yicha so’rovning «qiymati» (masalan, GraphQL complexity, batch o’lchami).
Moslashuvchan: anomaliyalarda qattiqlashadi (shubhali faollik/xatolar 401/403/5xx).
3) Algoritmlar va ularni qachon qo’llash
3. 1 Fixed window counter
Oddiy: hisoblagich (masalan, 100 r/min).
Afzalliklar: minimal qiymat. Minuslar: deraza chegaralaridagi «chekka berstlar».
Qachon: adminok panellari, past aniqlik, past narx.
3. 2 Sliding window (log / counter)
Log: So’nggi so’rovlarning vaqt belgilarini saqlaydi.
Counter: ikkita qo’shni oyna o’rtacha (rolling), aniqlik va narx bo’yicha murosa.
Qachon: o’rtacha trafikning ommaviy APIlari, murakkab matematikasiz silliq bo’lishi kerak.
3. 3 Token bucket
Parametrlar:’r’(token/sek) tezligi va’b’(burst) sig’imi. Har bir soʻrov tokenni yoqadi.
Afzalliklari: tabiiy burst allowance, sodda amalga oshirish. Kamchiliklar: qat’iy bir tekislik yo’q.
Qachon: Deyarli har doim RPS uchun, agar’b’ichida «to’p» kerak bo’lsa.
3. 4 Leaky bucket (drip)
Belgilangan tezlikda «qochib ketadigan» navbat.
Ijobiy tomonlari: tekis chiqish oqimi. Kamchiliklar: ko’proq kechikishlar.
Qachon: tashqi «mo’rt» provayderlarga tekislash.
3. 5 GCRA (Generalized Cell Rate Algorithm)
Nazariy kelish vaqti modeli (TAT):- ’TAT _ next = max (TAT_current, now) + 1/r’, agar’now <= TAT_current + burst/r’bo’lsa, so’rov qabul qilingan.
- Afzalliklari: qattiq, aniq, kam xotira (biz TAT kalitini saqlaymiz). Kamchiliklar: tushunish qiyinroq.
Qachon: qat’iy nazorat va silliq, taqsimlangan limitlar kerak.
3. 6 Raqobat semaforalari
Aktiv operatsiyalar hisoblagichi; kirish - agar «chiptalar» mavjud bo’lsa; chiqish - ozod qilish.
Qachon: long-running operatsiyalar, oqimlar, WebSocket, yuklab olish.
4) Limitlar kalitlari modeli
Kalit = atributlar kombinatsiyasi:- `client_id`/`api_key`/`user_id`/`org_id`
- ’IP/ASN/geo’ (qo’pol himoya)
- ’endpoint/method’ (issiq yoʻnalishlar)
- ’scope/plan/tier’ (monetizatsiya)
- ’idempotency _ key’ (write-operatsiyalar)
- Ierarxiyadan foydalaning: avval qattiq per-kalit, keyin per-tashkilot, keyin global.
5) So’rov og’irligi (cost model)
’cost (q)’ qiymatini aniqlang:- GraphQL: maydon murakkabligi × chuqurligi.
- REST: javob/so’rov hajmi, operatsiya turi (read = 1, write = 3, hisobot = 10).
- Batch: `cost = min(n, cap)`.
- «So’rovlar» emas, balki tokenlar chegaralanadi:’budget - = cost (q)’.
6) Taqsimlangan sotish
6. 1 Saqlash joylari
In-process: ultra tez, lekin umumiy limit emas (mahalliy «yumshoq» limitlar uchun mos).
Redis: de-fakto standart. INCR/EXPIRE, Lua skriptlari (atomarlik), sliding window uchun ZSET, TTL kalitlari.
Envoy/NGINX/Kong/Traefik: ichki filtrlar; perimetri uchun qulay.
Service Mesh: sidecar + global sinxronizatsiya uchun lokal limitlar.
6. 2 Atomarlik va poyga
Redisdagi Lua: bir qadamda tekshirish va inkrement.
GCRA: bitta TATni CAS/skript bilan saqlash.
Soat muvofiqligi: NTP, monoton taymerlar.
Sharding: kalit bo’yicha konsistent xesh; «issiq» shardlardan saqlaning.
6. 3 Georaylash
Mintaqaviy klasterlarda lokal limitlar + yuqori global (coarse).
CRDT/replikatsiya - ehtiyotkorlik bilan (kechikishlar, ikki baravar sarflash). Zaxirali mintaqaviy limitlar afzalroq.
7) Siyosat va ustuvorlik
Rejalar: Free/Pro/Enterprise turli’r’,’b’, kvotalar bilan.
Ustuvorliklar: «qimmat» yo’nalishlar kamroq limit yoki katta cost oladi.
Roʻyxatlar: integratsiyalar uchun allow-list, ASN/proxy/TOR boʻyicha deny.
Eskalatsiya: takroran oshganda - limitni pasaytiramiz, proof-of-work/kapcha/challengi kiritamiz.
8) Konfiguratsiyalar namunalari
8. 1 Envoy (HTTP rate limit filter, psevdo)
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 (lua + Redis, psevdo)
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 Raqobat limitlari (psevdokod)
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 (psevdokod)
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) Retralar, taymautlar va circuit breaker bilan integratsiya
Retry-budget: retrajlar ulushini asosiy trafikning X% gacha cheklang.
Jitter: backoff bilan har doim jitter qoʻshing - sinxron portlashlarni kamaytiradi.
Circuit breaker: katta xatolik (’5xx’, timeouts) bo’lsa, chegaralarni pasaytiring yoki yo’nalishlarning bir qismini «read-only» ga o’tkazing.
Hedging: ehtiyotkorlik bilan; byudjet sarfini ikki baravar oshirmaslik uchun costni hisobga oling.
10) Kuzatuv va boshqaruv
Метрики: `rps_allowed`, `rps_blocked`, `429_rate`, `retry_after_avg`, `burst_used`, `quota_remaining`, `active_concurrency`.
Yorliqlar: limit kaliti, mintaqa, endpint, reja bo’yicha.
Yechimlar loglari (samplirovannie): nosozlik sababi, joriy hisoblagichlar, TTL kaliti.
Dashbordlar: kalit/endpindlar bo’yicha issiqlik kartalari, «issiq» mijozlar.
Alertlar: kritik yo’nalishlarda o’sish 429> 2-5%, kvotalarning tez-tez «tugashi», shardlarning nomutanosibligi.
11) Test va validatsiya
Siyosatchilarning kontrakt testlari («agar» jadvallari).
Yuklama: burstlar (x10 dan r), uzoq platolar, «iflos» patternlar (slow-POST, uzoq birikmalar).
Chaos-trafik: notekis oqimlar, clock drift, Redis/mesh.
A/V-kiritish: canary rollout limitlar, shadow-echimlar (logo, lekin blokirovka qilmaymiz).
12) Edge-keyslar va nozikliklar
Clock skew:’now ()’dan mijoz sarlavhalaridan emas, balki yagona manbadan (server) foydalaning.
Idempotency-Key: write uchun - retralarda amplifikatsiyani kamaytiradi.
Batch operatsiyalari: batch hajmi va umumiy cost bo’yicha cheklang.
Long-poll/WebSocket: kanallar/obunalar soni va davomiyligi boʻyicha cheklang.
Cold start: hisoblagichlarni «iliq» ishga tushirish/oldindan yuklash; aks holda soxta portlashlar 429.
Hisoblash uchun qimmat so’rovlar: biznes-mantiqni bajarishdan oldin cheklang.
TTL chegaralari: TTL kalitlari + zaxira (safety margin) oynasini qoplashi kerak.
13) Antibot-eskalatsiya
Bosqichlar: ogohlantirish → 429 +’Retry-After’→ challenj (kapcha/jumboq) → vaqtinchalik blok.
Signallar: device-fingerprint, kursor/tayminglar, TOR/proksi/xostinglar.
Siyosatchilar determinizatsiya qilinishi va forenzika uchun takrorlanishi kerak.
14) Xavfsizlik va komplayens
Kritik yo’nalishlarda Deny-by-default (write/moliya).
Audit: tartibga solish holatlari va hodisalarni tahlil qilish uchun limitlar bo’yicha qarorlarni saqlang.
PII: limit kalitlari jurnallardagi shaxsiy ma’lumotlarni oshkor qilmasligi kerak.
15) Prod-tayyorlik chek-varaqasi
- Limit kalitlari va cost modeli aniqlandi.
- Algoritm (token bucket/GCRA) va saqlash (Redis/shlyuz) tanlangan.
- Mijozlar uchun tier’lar siyosati + global «sug’urtalovchilar».
- Uzoq muddatli operatsiyalar uchun raqobat limitlari.
- Retry-budget, jitter bilan backoff, circuit breaker bilan integratsiya.
- Dashbordlar/alertlar, sampllangan yechimlar.
- Canary-qoʻshish va shadow-mode.
- Burst testlari, uzoq platolar, Redis nosozliklari, clock skew.
- Mijozlar uchun hujjatlar: 429,’Retry-After’kodlari, eksponensial backoff namunalari.
16) TL; DR
Redis/shlyuzli token bucket yoki GCRA’dan foydalaning, limit kalitlari va so’rovlar qiymatini loyihalashtiring, uzoq muddatli operatsiyalar uchun raqobatbardosh semaforlarni qo’shing, retry-budget va circuit breaker bilan integratsiyalashtiring, 429 va «burst-sig’imi» ni kuzating, limitlarni canary/shadow orqali yoying va sinab ko’ring burstlar va omborning ishdan chiqishi.