Rate Limits we ýük gözegçiligi
TL; DR
Ygtybarly kontury - birnäçe derejedäki (edge → BFF → hyzmat) çäkleriň we kwotalaryň utgaşmasy, çeşmeleriň adalatly paýlanmagy (per-tenant/açar/rout), SLO-uýgunlaşdyrylan trottling we sessiz wagtlaryň ýerine bekpreser. "Tizlik" üçin token/leaky bucket, buhgalteriýa kwotalary üçin süýşýän penjire, agyr amallar üçin bäsdeşlik çäkleri, zaýalananda dynamic throttling we gowşak akymlara circuit-breaker ulanyň. Hemme zat gözegçilik astynda we pleýbuklar bilen.
1) Näme üçin iGaming/fintech-de çäklendirmeler
SLO we durnuklylyk: retraý göçlerinden, ýaryşlaryň/ewentleriň iň ýokary derejelerinden, tölegleriň köpelmeginden goramak.
Adalat: bir tenant ýa-da hyzmatdaş tutuş býudjeti "sormaýar".
Antiabuse/botlar: login/hasaba alyş, spam, kataloglary syzmak.
Bahasy: gymmat jaňlaryň öňüni almak (KYC, hasabatlar, agregasiýalar).
Ylalaşyk/ynsaply peýdalanmak: şertnamalarda resmi "fair use" kwotalary.
2) Çäkleriň taksonomiýasy
3) Algoritmler we nirede ulanmak
3. 1 Token Bucket (adaty)
Parametrler: 'rate' (bellikler/sek), 'burst' (iň ýokary ätiýaçlyk).
API okamak, tölemek/statuslar, BFF üçin ajaýyp.
Boş baket bilen → 429 + 'Retry-After'.
3. 2 Leaky Bucket (orta)
RPS-iň kepillendirilen "ýykylmagy" webhuklar üçin peýdaly.
3. 3 Fixed Window vs Sliding Window
Fixed - ýönekeý, ýöne "serhetler"; Sliding - penjirede dogruçyl hasap (min/sagat/gün).
Şertnama kwotalary üçin Sliding ulanyň.
3. 4 Concurrent Limits
Bir wagtyň özünde işjeň meseleleriň çägi. Eksport/hasabat, KYC-paketleri, gaýtadan işlemek üçin amatly.
Ýetmezçilik edilende - 429/503 + nobat/polling.
3. 5 Cost/Complexity Limiter
GraphQL/gözleg: çuňlugy/kardinallygy/giňelmegi boýunça "bahany" hasaplaýarys.
"Gymmat" haýyşlaryň kesilmegi/zaýalanmagy, yşarat bilen jogap.
4) Çäklendirme açarlary (dimensioning)
per-tenant (köp kärende, adalat),
per-api_key/client_id (hyzmatdaşlar),
per-route (has agyr mutasiýa),
per-user/device/IP/ASN/geo (antibot/anti-skrep),
per-BIN/country (töleg usullary, emitentleri we üpjün edijileri goramak),
per-method (GET has ýumşak, POST/PUT has berk).
Kompozisiýa: esasy açar + "töwekgelçilik multiplikatory" (täze hasap, TOR/proxy, ýokary chargeback-töwekgelçilik).
5) SLO-uýgunlaşdyrylan trottling
SLO howp astynda dynamic throttling-i açyň:- Triggerler: 'p95 latency ↑', '5xx ↑', 'queue len ↑', 'CPU/IO saturation'.
- Hereketler: rate/burst azaltmak, outlier-ejection açmak, "gymmat" routes kesmek, wagtlaýyn degrade (agyr meýdanlar/agregasiýalar bolmazdan).
- Yzyna gaýtarmak: yzly-yzyna N aralyk signallary kadalaşanda (25 → 50 → 100%).
6) Arhitektura integrasiýa
API Gateway (edge): ilkinji rate/quotas, geo/ASN, HMAC/JWT-tassyklama, 429/' Retry-After '.
BFF/Service Mesh: inçe per-route/per-tenant limitleri, concurrent-limits, circuit-breakers apstrimlere.
Hyzmatyň içinde: agyr amallar üçin semaforlar, nobatlardaky bekpreşer, bound ölçegli "iş howuzlary".
Webhuke: leaky bucket we retraý buferi bolan aýratyn ingress-endpoint.
7) Konfigurasiýalar (bölekler)
Kong / NGINX-style (rate + burst):yaml plugins:
- name: rate-limiting config:
policy: local minute: 600 # 10 rps limit_by: consumer fault_tolerant: true
- name: response-ratelimiting config:
limits:
heavy: { minute: 60 }
Envoy (circuit + outlier + rate):
yaml circuit_breakers:
thresholds: { max_connections: 1000, max_requests: 800 }
outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s http_filters:
- name: envoy. filters. http. local_ratelimit typed_config:
token_bucket: { max_tokens: 100, tokens_per_fill: 100, fill_interval: 1s }
filter_enabled: { default_value: 100% }
filter_enforced: { default_value: 100% }
Concurrent-limits (psevdo):
pseudo sema = Semaphore(MAX_ACTIVE_EXPORTS_PER_TENANT)
if! sema. tryAcquire(timeout=100ms) then return 429 with retry_after=rand(1..5)s process()
sema. release()
GraphQL cost guard (pikir):
pseudo cost = sum(weight(field) cardinality(arg))
if cost > tenant. budget then reject(429,"query too expensive")
8) Dürli kanallar üçin syýasatlar
REST
GET - has ýumşak, POST/PATCH/DELETE - has berk; "idempotent" statuslary/barlaglary yzyna gaýtaryp bolýar.
Tölegler üçin: "auth/capture/refund 'per-user/tenant/BIN/ýurt.
GraphQL
Depth/complexity caps, persisted/whitelisted queries, "alias" çäkleri.
WebSocket/SSE
Ýygylyk çäkleri 'subscribe/unsubscribe', topikleriň sanyna kapp, wakalaryň ululygyna gözegçilik we send-queue → 'policy _ disconnect' dolanda.
Webhuklar
Leaky bucket kabul edilende, per-sender kwotalar, dead-letter nobat, determinirlenen 2xx/429.
9) Müşderilere seslenme
Elmydama aç-açan 429 sözbaşy bilen yzyna gaýtaryň:- `Retry-After:
` - `X-RateLimit-Limit/Remaining/Reset`
- Kwotalar üçin - 403 "quota _ exceeded" kody we meýilnamany täzelemäge baglanyşygy bilen.
- Resminamalar: OpenAPI/SDL + "Fair Use" sahypasyndaky çäkler.
10) Gözegçilik we daşbordlar
Metrikler:- Çäkleriň hitleri: 'rate. limit. Açarlar/routler/tenantlar boýunça hit '.
- 429/503 доля, latency p50/p95/p99, error rate, queue length, open circuits.
- Fair-share: "bully detector".
- Webhuklar: kabul/retrai, drop-rate, orta lag.
- 429 umumy RPS-iň 1-3% -inden köp bolmaly däldir (botsyz).
- p95 çäklendiriji goşundy ≤ edge-de 5-10 ms.
- Pese gaçandan soň dikeldiş wagty ≤ 10 minut.
sql
SELECT ts::date d, tenant, route,
SUM(hits) AS limit_hits,
SUM(total) AS total_calls,
SUM(hits)::decimal/NULLIF(SUM(total),0) AS hit_rate
FROM ratelimit_stats
GROUP BY 1,2,3
ORDER BY d DESC, hit_rate DESC;
11) Wakalaryň pleýbuklary
Retraý tupany: Global throttling-i açyň, backoff-i galdyryň, circuit-breaker-i açyň, wagt nokatlarynyň ýerine "çalt ýalňyşlyklary" yzyna gaýtaryň.
Bot-hüjüm/slaýping: IP/ASN/geo boýunça gaty gapak, WAF/JS-çagyryşy açyň, kataloglary/gözlegleri çäklendiriň.
Ýaryşyň/ewentiň iň ýokary derejesi: okamagyň çäklerini öňüni almak, "gymmat meýdanlary" azaltmak, kesh/denormalizasiýany goşmak.
PSP-den webhuklary boşatmak: wagtlaýyn leaky bucket, kritiki görnüşleriň ileri tutulmagy, dead-letter we retraini giňeltmek.
12) Synag we UAT
Ýüklemek: RPS basgançak, burst × kadadan 10.
Adalat: 1 "açgöz" tenantyň emulýasiýasy - global býudjetiň X% -inden köp bolmaly däldir.
Pese gaçmak: SLO-uýgunlaşma çäkleri azaldýar we p95 koridorda saklaýar.
Serhet ýagdaýlary: penjiräniň üýtgemegi (min → sagat), sagadyň titremesi (clock skew), Redis masştaby/açar çardagy.
Şertnama: 429 we Retry-After sözbaşylary bar, SDK dogry arka offit.
13) Çäkler üçin ammar
Lokal çäkler üçin In-memory (kiçi toparlar).
Paýlanan üçin Redis/Memcached (Atom üçin Lua skriptleri).
Açarlary kesmek; Penjireleriň aşagyndaky TTL; keş ýitirmek üçin ekap metrika.
Idempotency: limiter idempotent gaýtalanýan çagyryşlary bozmaly däldir (soragyň açary boýunça hasap).
14) Syýasaty dolandyrmak (Governance)
Çäklendirmeleriň katalogy: kimiň eýesi, haýsy açarlar/bosagasy/rasional.
Çalt geçiş üçin feature-flags (crisis mode).
Şertnamalaýyn kwotalary üýtgetmek üçin syýasatlary we RFC-prosesi wersiýalaşdyrmak.
A/B optimal çäkleri saýlamak boýunça synaglar.
15) Anti-patternler
"Ähli API-ler üçin" global bir çäk.
Diňe kesgitlenen penjireler → "Gyra" at çapyşyklary.
Seslenmesiz çäk (ýok 'Retry-After '/headers).
Çalt wagtlaryň ýerine sessiz wagt-autlar 429/503.
per-tenant fair-share ýoklugy - bir müşderi beýlekileri bogup öldürýär.
GraphQL/gözleg goragy ýok.
Nullar concurrent-guard → "tozan sorujy" DD/PSP.
16) Saýlawyň kiçi şpargalkasy
Variant: token bucket (rate + burst) per-tenant + route.
Pul/hasabat boýunça kwotalar: sliding window gün/aý.
Agyr amallar: concurrent-limits + nobat.
GraphQL/поиск: complexity-budgets + persisted queries.
WS/webhuklar: leaky bucket + backpressure.
Кризис: dynamic throttling + circuit-breaker + degrade.
Gysgaça maglumat
Ýüklere gözegçilik etmek köp derejeli düzgün-nyzam: dogry algoritmler (bucket/penjire/bäsdeşlik), adalatly çäklendirme açarlary, SLO-uýgunlaşma we aç-açan seslenme. Gateway/mesh/hyzmatlara çäklendirmeler girizip, GraphQL/WS/webhuklary ýöriteleşdirilen syýasatlar bilen ýaraglandyryp we playbuklar bilen syn etmek arkaly, iň ýokary wakalary we beýleki adamlaryň şowsuzlyklaryny dolandyrylýan ýagdaýlara öwürýärsiňiz - boýag, tölegler we öwrülişikler bolmazdan.