rate limiter's долбоорлоо
1) Эмне үчүн rate limiting
Rate limiting APIнин жеткиликтүүлүгүн жана экономикасын коргойт: флуддорду, "бурстарды" ретраларды, credential stuffing токтотот, кымбат транзакцияларды (акча транзакцияларын, отчетторду генерациялоону) коргойт, көз каранды системаларга (BD/провайдерлерге) жүктү жумшартат. Жакшы дизайн адилеттүүлүк (fairness), жашыруун жана так SLO алдын ала берет.
Негизги максаттар
RPS туруктуулугу жана ашыкча жүктөө арткы коргоо.
Башкарылуучу "ийкемдүүлүк" (burst allowance).
Кардарлардын дифференциациясы (per-user/per-organization/per-key/per-IP/per-region).
Наркы модели: ар кандай операциялар үчүн ар кандай "баалар".
2) Лимиттердин түрлөрү
RPS-лимиттери: секундасына/мүнөткө суроо.
Квоталар: мезгилдин жалпы бюджети (күн/ай).
атаандаштык: бир эле учурда иш (текшерүү, оор job).
Ылдамдыгы/тилкеси: байт/сек (жүктөө/түшүрүү).
Салмактуу лимиттер: татаалдыгы боюнча суроо-талаптын "наркы" (мисалы, GraphQL complexity, batch өлчөмү).
Adaptive: аномалиялар менен ката (шектүү иш/ката 401/403/5xx).
3) Алгоритмдер жана аларды качан колдонуу
3. 1 Fixed window counter
Жөнөкөй: аралыкка эсептегич (мисалы, 100 r/min).
Артыкчылыктары: минималдуу наркы. Кемчиликтери: терезенин чектеринде "четки берсттер".
Качан: администратор панелдер, төмөн тактык, төмөн наркы.
3. 2 Sliding window (log / counter)
Log: акыркы суроо-убакыт белгилерин сактайт, так, эс кымбат.
Counter: эки кошуна терезелер (rolling) орточо, тактык жана баа компромисс.
Качан: коомдук орточо жол API, татаал математика жок жылмакай керек.
3. 3 Token bucket
Параметрлери: 'r' ылдамдыгы (токендер/сек) жана 'b' сыйымдуулугу (бурст). Ар бир өтүнүч токенди "өрттөйт".
Артыкчылыктары: табигый burst allowance, жөнөкөй ишке ашыруу. кемчиликтери: эч кандай катуу бир калыпта.
Качан: дээрлик ар дайым RPS үчүн, керек болсо "залп" ичинде 'b'.
3. 4 Leaky bucket (drip)
белгиленген ылдамдык менен "агып" турган кезек.
Артыкчылыктары: тегиз чыгаруу агымы. Кемчиликтери: көбүрөөк кечигүү.
Качан: тышкы "морт" провайдерлерге тегиздөө.
3. 5 GCRA (Generalized Cell Rate Algorithm)
Теориялык келүү убактысы модели (TAT):- 'TAT _ next = max (TAT_current, now) + 1/r', эгерде 'now <= TAT_current + burst/r'.
- Артыкчылыктары: катуу, так, аз эс (негизги TAT сактоо). Кемчиликтери: түшүнүү үчүн кыйын.
Качан: катуу көзөмөл жана жылмакайлык, бөлүштүрүлгөн лимиттер керек.
3. 6 Атаандаштык семафорлор
Активдүү операциялар эсептегич; кирүү - "билеттер" бар болсо; чыгаруу - боштондук.
Качан: узакка созулган иш, агымдар, WebSocket, жүктөмөлөр.
4) Лимит ачкычтарынын модели
Ачкыч = атрибуттардын айкалышы:- `client_id`/`api_key`/`user_id`/`org_id`
- 'IP/ASN/гео' (орой коргоо)
- 'endpoint/method' (ысык жолдор)
- 'scope/plan/tier' (акча табуу)
- 'idempotency _ key' (write-операциялар)
- Иерархияны колдонуңуз: биринчи катуу per-ачкыч, андан кийин per-уюм, андан кийин глобалдык.
5) суроо-салмагы (cost модели)
"Наркы" 'cost (q)' деп аныктаңыз:- GraphQL: талаалардын татаалдыгы × тереңдиги.
- REST: жооп/суроо көлөмү, операция түрү (read = 1, write = 3, отчет = 10).
- Batch: `cost = min(n, cap)`.
- 'budget - = cost (q)'.
6) Бөлүштүрүлгөн ишке ашыруу
6. 1 сактоо
In-process: ультра тез, бирок жалпы лимит эмес (жергиликтүү "жумшак" лимиттер үчүн жарактуу).
Redis: иш жүзүндө стандарт. INCR/EXPIRE, Lua скрипт (атомдук), ZSET үчүн sliding window, TTL менен ачкычтар.
Envoy/NGINX/Конг/Traefik: орнотулган чыпкалар; периметри үчүн ыңгайлуу.
Service Mesh: sidecar + глобалдык синхрондоштуруу боюнча жергиликтүү чектөөлөр.
6. 2 атомдук жана жарыш
Redis боюнча Lua: бир кадам текшерүү жана инкремент.
GCRA: CAS/скрипт менен бир TAT сактоо.
Саат шайкештиги: NTP, монотондук таймери.
Sharding: ачкыч боюнча консистенттик хеш; "ысык" шарддан алыс болуңуз.
6. 3 Гео бөлүштүрүү
Аймактык кластерлерде жергиликтүү лимиттер + жогорку глобалдык (coarse).
CRDT/репликация - этияттык менен (кечигүү, кош керектөө). Запастагы аймактык лимиттер артыкчылыктуу.
7) Саясат жана артыкчылыктуу
Пландар: Free/Pro/Enterprise ар кандай 'r', 'b', квоталар менен.
Артыкчылыктар: "кымбат" маршруттар азыраак лимитти же көбүрөөк чыгымдарды алышат.
Тизмелер: интеграция үчүн allow-list, ASN/proxy/TOR боюнча deny.
Эскалация: кайра ашканда - лимитти төмөндөтөбүз, proof-of-work/capcha/challenge киргизебиз.
8) Конфигурациялардын мисалдары
8. 1 Envoy (HTTP rate limit filter, псевдо)
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, псевдо)
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 (psevdocode)
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) Retrains, убакыт жана circuit breaker менен бириктирүү
Retry-budget: негизги жол X% чейин retrains үлүшүн чектөө.
Jitter: backoff менен ар дайым Jitter кошуу - синхрондуу жарылууларды азайтат.
Circuit breaker: жогорку ката менен ('5xx', timeouts) лимиттерди азайтуу же "read-only" маршруттардын бир бөлүгүн которуу.
Hedging: кылдат; бюджеттин чыгымын эки эсеге көбөйтпөө үчүн бааны эске алыңыз.
10) Байкоо жана башкаруу
Метрики: `rps_allowed`, `rps_blocked`, `429_rate`, `retry_after_avg`, `burst_used`, `quota_remaining`, `active_concurrency`.
Лейблдер: лимиттин ачкычы, аймак, эндпоинт, план боюнча.
Чечимдер Логи (Sample): ката себеби, учурдагы эсептегичтер, TTL ачкычы.
Dashbord: ачкычтар/EndPoint боюнча жылуулук карталары, "ысык" кардарлар.
Alerty: критикалык каттамдар боюнча өсүш 429> 2-5%, тез-тез "түгөнүп" квоталар, дисбаланс шардалар.
11) Тестирлөө жана валидация
Саясаттын контракттык тесттери (таблицалар "эгерде").
Жүктөө: бурсттар (x10 r), узун платолор, "кир" үлгүлөрү (slow-POST, узун байланыштар).
Chaos Traffic: бир калыпта эмес агымдар, clock drift, Redis/mesh түшүү.
A/V-киргизүү: canary rollout лимиттери, shadow-чечимдер (Логикалык, бирок бөгөт жок) чейин киргизүү.
12) Edge учурларда жана кылдат
Clock skew: кардардын аталышынан эмес, бир булактан (сервер) 'now ()' колдонуңуз.
Idempotency-Key: write үчүн - retras боюнча amplification азайтат.
Batch-операциялар: батч өлчөмү жана жалпы наркы боюнча чектөө.
Long-poll/WebSocket: каналдардын/жазылуулардын саны жана узактыгы боюнча чектөө.
Cold баштоо: "жылуу" эсептегичтерди баштоо/алдын ала жүктөө; болбосо жалган жарылуулар 429.
Эсептөө кымбат суроо-талаптар: бизнес-логикага чейин чектөө.
TTL чектери: TTL ачкычтар терезени + камды (коопсуздук чеги) жабуу керек.
13) Antibot-эскалация
Баскычтар: эскертүү → 429 + 'Retry-After' → challenge (капча/пазл) → убактылуу блок.
Сигналдар: device-fingerprint, курсор жүрүм-туруму/таймингдер, TOR/прокси/хостинг.
Саясатчылар аныкталууга жана forensics үчүн кайталанышы керек.
14) Коопсуздук жана комплаенс
Deny-by-default критикалык жолдор боюнча (write/каржы).
Аудит: жөнгө салуучу учурлар жана инциденттерди талдоо үчүн лимиттер боюнча чечимдерди сактаңыз.
PII: лимиттердин ачкычтары логдордогу жеке маалыматтарды ачыкка чыгарбоого тийиш.
15) Prod-даярдык чек тизмеси
- Лимиттердин ачкычтары жана cost модели аныкталган.
- Тандалган алгоритм (token bucket/GCRA) жана сактоо (Redis/шлюз).
- Кардарлардын tier's + глобалдык "сактагычтар" үчүн саясат.
- Узак операциялар үчүн атаандаштык лимиттер.
- Retry-budget, Jitter менен backoff, circuit breaker менен бириктирүү.
- Dashbord/alerty, Sample Логи чечимдер.
- Canary-киргизүү жана shadow-режими.
- Бурст тесттер, узакка созулган плато, Redis ката, clock skew.
- кардарлар үчүн документтер: 429 коддору, 'Retry-After', экспоненциалдык backoff мисалдар.
16) TL; DR
Redis/шлюз менен token bucket же GCRA колдонуңуз, лимит ачкычтарын жана суроо-талаптардын баасын долбоорлоңуз, узак операциялар үчүн атаандаштыкка жөндөмдүү семафорлорду кошуңуз, retry-budget жана circuit breaker менен интеграцияңыз, 429 жана "бурст сыйымдуулугун" байкаңыз, канар/shadow аркылуу лимиттерди жылдырыңыз жана сөзсүз түрдө сынаңыз Bourstes жана сактоо ийгиликсиз.