Rate limiter
1) Näme üçin rate limiting
Rate limiting API-iň elýeterliligini we ykdysadyýetini goraýar: fludlary, retraýlaryň "burstlaryny", credential stuffing saklaýar, gymmat amallary (pul amallaryny, hasabatlaryň döredilmegini) goraýar, garaşly ulgamlara (DB/üpjün edijiler) ýüküni ýumşadýar. Gowy dizaýn adalatlylygy (fairness), gizlinligi we aýdyň SLO-lary berýär.
Esasy maksatlar
RPS durnuklylygy we arka tarapy artykmaç ýüklerden goramak.
Dolandyrylýan "elastiklik" (burst allowance).
Müşderileri tapawutlandyrmak (per-ulanyjy/per-gurama/per-açar/per-IP/per-sebit).
Gymmatlyk modeli: dürli amallar üçin dürli "bahalar".
2) Çäkleriň görnüşleri
RPS çäkleri: sekuntda/minutda soraglar.
Kwotalar: döwürdäki jemi býudjet (gün/aý).
Bäsdeşlik ukyby: bir wagtyň özünde geçirilen amallar (checkout, heavy job).
Tizlik/zolak: baýt/sekunt (ýüklemek/düşürmek).
Deňagramly çäkler: çylşyrymlylygy boýunça haýyşyň "bahasy" (mysal üçin, GraphQL complexity, batch ululygy).
Uýgunlaşma: anomaliýalarda hasam güýçlendirilýär (şübheli işjeňlik/401/403/5xx ýalňyşlyklar).
3) Algoritmler we olary haçan ulanmak
3. 1 Fixed window counter
Ýönekeý: aralyk hasaplaýjy (mysal üçin 100 r/min).
Artykmaçlyklary: iň pes bahasy. Minuslar: penjiräniň çäklerinde "gyra berstleri".
Haçan: dolandyryş panelleri, pes takyklyk, arzan çykdajy.
3. 2 Sliding window (log / counter)
Log: Soňky haýyşlaryň wagt belliklerini saklaýar, takyk, ýat taýdan gymmat.
Counter: iki sany goňşy penjire (rolling), takyklyk we baha ylalaşygy.
Haçan: Orta traffigiň köpçülige açyk API-leri, çylşyrymly matematikasyz tekizlige mätäç.
3. 3 Token bucket
Parametrler: 'r' (token/sek) tizligi we 'b' (burst) kuwwaty. Her haýyş belligi "ýakýar".
Artykmaçlyklary: tebigy burst allowance, ýönekeý durmuşa geçirmek. Minuslar: berk birmeňzeşlik ýok.
Haçan: 'b' içinde "wolf" gerek bolsa, hemişe diýen ýaly RPS üçin.
3. 4 Leaky bucket (drip)
Kesgitlenen tizlik bilen "syzýan" nobat.
Plýuslar: tekiz akym. Minuslar: has gijikdirmeler.
Haçan: daşarky "gowşak" üpjün edijilere tekizlemek.
3. 5 GCRA (Generalized Cell Rate Algorithm)
Teoretiki geliş wagty (TAT) modeli:- 'TAT _ next = max (TAT_current, now) + 1/r', eger 'now <= TAT_current + burst/r' bolsa, haýyş kabul edildi.
- Plýuslar: berk, takyk, az ýat (açar boýunça TAT saklaýarys). Minuslar: düşünmek has kyn.
Haçan: berk gözegçilik we tekizlik, paýlanan çäkler zerur.
3. 6 Bäsdeşlik semaforlary
Işjeň amallary hasaplaýjy; giriş - "biletler" bar bolsa; çykmak - azat etmek.
Haçan: long-running amallar, akymlar, WebSocket, ýüklemeler.
4) Çäk açarlarynyň nusgasy
Açar = atributlar kombinasiýasy:- `client_id`/`api_key`/`user_id`/`org_id`
- 'IP/ASN/geo' (berk gorag)
- 'endpoint/method' (gyzgyn ýollar)
- 'scope/plan/tier' (monetizasiýa)
- 'idempotency _ key' (write-amallar)
- Iýerarhiýany ulanyň: ilki berk açar, soň gurama, soň global.
5) Soragyň agramy (cost model)
'cost (q)' bahasyny kesgitläň:- GraphQL: meýdan çylşyrymlylygy × çuňlugy.
- REST: jogap/haýyş ululygy, amal görnüşi (read = 1, write = 3, hasabat = 10).
- Batch: `cost = min(n, cap)`.
- "Soraglar" däl-de, bellikleri çäklendirýäris: 'budget - = cost (q)'.
6) Paýlanan satuw
6. 1 Ammar
In-process: ultra çalt, ýöne umumy çäk däl (ýerli "ýumşak" çäkler üçin amatly).
Redis: de-fakto standart. INCR/EXPIRE, Lua-skriptlar (atom), ZSET üçin sliding window, TTL bilen açarlar.
Envoy/NGINX/Kong/Traefik: içerki süzgüçler; perimetri üçin amatly.
Service Mesh: sidecar + global sinhronizasiýa üçin ýerli çäkler.
6. 2 Atom we ýaryş
Redisdäki Lua: bir ädimde barlamak we inkrement.
GCRA: CAS/script bilen bir TAT saklamak.
Sagadyň sazlaşygy: NTP, monoton taýmerler.
Sharding: açar heşi; "gyzgyn" şardlardan gaça duruň.
6. 3 Geo-paýlaýyş
Sebitleýin toparlarda ýerli çäkler + ýokarky global (coarse).
CRDT/replikasiýa - seresap (gijä galmak, iki esse sarp etmek). Ätiýaçlyk bilen sebit çäkleri has gowudyr.
7) Syýasatlar we ileri tutmak
Meýilnamalar: Dürli 'r', 'b', kwotalar bilen Free/Pro/Enterprise.
Ileri tutulýan ugurlar: "gymmat" ugurlar has kiçi çäk ýa-da has uly cost alýarlar.
Sanawlar: integrasiýa üçin allow-list, ASN/proxy/TOR boýunça deny.
Eskalasiýa: gaýtalananda - çäkleri peseldýäris, proof-of-work/kapça/challengi girizýäris.
8) Konfigurasiýalaryň mysallary
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 Bäsdeşlik çäkleri (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, wagtlar we circuit breaker bilen integrasiýa
Retry-budget: retraýlaryň paýyny esasy traffigiň X% -ine çenli çäklendiriň.
Jitter: backoff elmydama jitter goşuň - sinhron partlamalary azaldar.
Circuit breaker: ýokary ýalňyşlyk ýüze çyksa ('5xx', timeouts) çäkleri peseldiň ýa-da marşrutlaryň bir bölegini "read-only" -a geçiriň.
Hedging: seresaplylyk bilen; býudjet çykdajylaryny iki esse artdyrmazlyk üçin çykdajylary göz öňünde tutuň.
10) Gözegçilik we dolandyryş
Метрики: `rps_allowed`, `rps_blocked`, `429_rate`, `retry_after_avg`, `burst_used`, `quota_remaining`, `active_concurrency`.
Bellikler: çäk açary, sebit, endpoint, meýilnama boýunça.
Çözgütleriň ýazgylary (sampletlenen): şowsuzlygyň sebäbi, häzirki hasaplaýjylar, açaryň TTL.
Daşbordlar: açarlar/endpointler boýunça ýylylyk kartlary, "gyzgyn" müşderiler.
Alertler: möhüm ugurlarda ösüş 429> 2-5%, kwotalaryň ýygy-ýygydan "tükenmegi", şardlaryň deňsizligi.
11) Synag we tassyklama
Syýasatçylaryň şertnama synaglary ("eger-de" tablisalar).
Ýükleýiş: burstlar (x10-dan r), uzyn platolar, "hapa" patternler (slow-POST, uzyn baglanyşyklar).
Chaos-traffigi: deň däl akymlar, clock drift, Redis/mesh.
A/V-goşulma: canary rollout limitleri, shadow-çözgütleri (logirleýäris, ýöne bloklamaýarys) goşulmazdan ozal.
12) Edge-wakalar we inçelikler
Clock skew: 'now ()' -y müşderi sözbaşylaryndan däl-de, bir çeşmeden (serwerden) ulanyň.
Idempotency-Key: write üçin - retralarda amplifikasiýany peseldýär.
Batch amallary: batch ululygy we jemi bahasy boýunça çäklendiriň.
Long-poll/WebSocket: kanallaryň/abunalaryň sany we dowamlylygy boýunça çäklendiriň.
Cold start: hasaplaýjylaryň "ýyly" başlamagy/öňünden ýüklenmegi; ýogsam ýalan partlamalar 429.
Hasaplamak üçin gymmat haýyşlar: iş logikasyny ýerine ýetirmezden ozal çäklendiriň.
TTL çäkleri: TTL açarlary penjire + ätiýaçlyk (howpsuzlyk çäkleri) bilen örtülmelidir.
13) Antibot-eskalasiýa
Basgançaklar: duýduryş → 429 + 'Retry-After' → challenge (kapça/puzzle) → wagtlaýyn blok.
Signallar: device-fingerprint, kursoryň özüni alyp barşy/taýmingler, TOR/proxy/hostingler.
Syýasatçylar determinirlenmeli we forensika üçin köpeldilmeli.
14) Howpsuzlyk we gabat gelmek
Möhüm ugurlarda Deny-by-default (write/maliýe).
Audit: kadalaşdyryjy hadysalar we wakalary seljermek üçin çäklendirmeler boýunça çözgütleri saklaň.
PII: Çäklendirmeleriň açarlary şahsy maglumatlary ýazgylarda açyp görkezmeli däldir.
15) Prod-taýynlyk çek-sanawy
- Çäk açarlary we cost-model kesgitlenildi.
- Algoritm (token bucket/GCRA) we ammar (Redis/şlýuz) saýlandy.
- Müşderiler üçin syýasatlar + global "ätiýaçlandyryjylar".
- Uzak möhletli amallar üçin bäsdeşlik çäkleri.
- Retry-budget, jitter bilen backoff, circuit breaker bilen integrasiýa.
- Daşbordlar/alertler, sample çözgütler.
- Canary-açmak we shadow-re modeimi.
- Burst, uzyn plato, Redis, clock skew synaglary.
- Müşderiler üçin resminamalar: 429, 'Retry-After' kodlary, eksponensial backoff mysallary.
16) TL; DR
Redis/şlýuzly token bucket ýa-da GCRA ulanyň, limit açarlaryny we talap bahalaryny dizaýn ediň, uzak amallar üçin bäsdeşlik semaforlaryny goşuň, retry-budget we circuit breaker bilen birleşdiriň, 429-a we "burst-kuwwatyna" syn ediň, limitleri canary/shadow arkaly ýaýradyň we hökman synagdan geçiriň burstlar we ammaryň şowsuzlygy.