Backend: кезек, async, backpressure жауабын оңтайландыру
1) Не үшін: мақсаттар және SLO
Мақсат - жарқылдағанда да тұрақты жылдам жауап беру. Бизнес бұл SLO білдіреді:- API (CRUD/каталогтар): p95 ≤ 250-400 мс, error rate <1%.
- Төлем/сеттлмент (асинхронды): растау үшін ішкі SLA ≤ 2-5 минут, ал клиентке - жедел 202/Accepted + статус-поллер/вебхук.
- WS/real-time: RTT p95 ≤ 120 мс, disconnect ≤ 0. 5%.
Кілт: «баяу» қадамдарды (провайдерлер, ДБ, сыртқы API) кезек және жүктемені сауатты шектеу арқылы пайдаланушы жауабынан шешу.
2) Негізгі көрініс: жасырындылық қайда алынады
Тар жерлер: ДБ (пулдар/индекстер), сыртқы провайдерлер (PSP/ойын), бұғаттайтын I/O, GC/stop-world, серияландыру JSON, «ауыр» агрегациялар.
Белгілері: p99 өсу, ДБ қосылыстарының кезегі, ретрайлардың жарылысы, тізбектелген тайм-ауттар (retry storm).
Антидот: асинхронды конвейерлер + backpressure + тайм-ауттар/ретрайлер + идемпотенттілік.
3) Асинхронды үлгілер: SEDA және CQRS
SEDA (staged event-driven architecture): өңдеуді кезеңге бөліңіз (ingress → валидация → жазба → интеграция → хабарлама). Әрқайсысының өз кезегі мен параллелизм лимиттері бар.
CQRS: оқу мен жазуды бөлісіңіз. Жазу - журналға/базаға, оқу - проекциялардан/кэштерден.
Outbox: оқиға жазбамен бірге атомарлық түрде жарияланады («жоғалған» хабарларды болдырмаймыз).
Saga: жаһандық емес, өтемдік транзакциялармен ұзақ бизнес-процестер.
4) Кезектер мен ағындар: таңдау және тюнинг
RabbitMQ/NATS JetStream - тапсырмалар командасы (work queues), Kafka - репликасы бар оқиғалар/ағымдар.
Жауап беруге әсер ететін параметрлер:- Prefetch/max in-flight: БД/сыртқы API-ны «толтырмау» үшін бір уақытта өңделетін воркер хабарларының санын шектеңіз (мысалы, 16-64).
- Акер/қайталаулар: idempotent жазбадан кейін 'ack'; экспоненциалдық кідіріспен және джиттермен қайталау.
- DLQ/parking lot: ұшсыз ретраялар жоқ - N әрекеттерден кейін Dead Letter Queue-ге кетеді.
- Партиялану (Kafka): мәні бойынша (userId/txnId) ретке келтіру үшін кілт; партиялардың саны арқылы параллелизм.
5) Кері қысым (backpressure) - қалай суға батпау
Идея: SLO жасырындылығы шегінде қаншалықты өңдей алсаңыз, соншалықты қабылдаңыз.
Техника:- Admission control: әрбір сыртқы тәуелділікке бәсекелестікті (semaphore/worker-pool) шектеңіз: БД, PSP, ойын провайдері.
- Трафиктің шейпингі: token-bucket/leaky-bucket сервис кіре берісінде және сындарлы бағыттарда.
- Жоғарғы шегі бар кезектер: толтырған кезде - құйрығын кесеміз (429/503 + Retry-After) немесе asap-batch-ке көшіреміз.
- Adaptive concurrency (AIMD): табыста параллелизмді өсіріңіз, тайм-аутта төмендетіңіз.
- Circuit Breaker: 'closed → open → half-open' қателер/сыртқы API тайм-ауттары бойынша; open - деградация (кэш/стаб).
go sem: = make (chan struct {}, 64 )//БД/PSP бәсекелестік лимиті
func handle(req) {
select {
case sem <- struct{}{}:
defer func(){ <-sem }()
ctx, cancel:= context. WithTimeout(req. ctx, 300time. Millisecond)
defer cancel()
res, err:= db. Do(ctx, req)
if err == context. DeadlineExceeded { metrics. Timeouts. Inc(); return TooSlow() }
return Ok(res)
default:
metrics. Backpressure. Inc()
return TooBusy(429, "Retry-After: 0. 2")
}
}6) Тайм-ауттар, ретраилер және джиттер: «үш тіршілік киті»
Тайм-ауттар SLO-дан қысқа: егер SLO 400 мс болса, БД/провайдерге тайм-аут 250-300 мс; сұрау салудың жалпы тайм-ауты <400-600 мс.
Ретраялар шектеулі және ақылды: 1-2 әрекет max, тек қауіпсіз операциялар үшін (идемпотенттік), экспонентпен және джиттермен.
Коалиция: бір кілт үшін қайталауларды біріктіріңіз.
Жалған құжат (экспонент + джиттер):python for attempt in range(0, 2):
try:
return call(dep, timeout=0. 3)
except Timeout:
backoff = (0. 05 (2attempt)) + random. uniform(0, 0. 05)
sleep(backoff)
raise UpstreamUnavailable7) Идемпотенттілік және дедупликация
Idempotency-Key HTTP-ке (депозиттер, төлемдер), 'operation _ id' ДҚ-ға (бірегей индекс).
Inbox/Outbox: кіріс веб-хаттар - әрқашан detupe-ден 'event _ id' дейінгі өзгермейтін inbox кестесі арқылы; шығыс - транзакция бойынша outbox-тан.
Exactly-once «мағынасы бойынша»: қайталап жеткізуге/орындауға рұқсат етеміз, бірақ бір нәтиже.
8) Баяу операциялар үшін жылдам API
Ілеспе жауап: 201/202 + мәртебесінің URL ('/status/{ id} '), ETA және ретрай кеңестер.
Вебхукилер/Server-Sent Events/WS - дайын болған кезде іске қосылатын стейт.
Клиенттік тәртіп: 'Retry-After', іспеттілік, пікіртерім лимиті.
Жауап мысалы:json
HTTP/1. 1 202 Accepted
Location: /v1/withdrawals/req_9f2/status
Retry-After: 2
{
"request_id": "req_9f2",  "state": "processing",  "next_check_sec": 2
}9) Ыстық жолда жұмысты барынша азайтамыз
Түрлендіру, біріктіру, құлақтандыру, DWH жазу сияқты ауыр заттарды алып шығыңыз.
Кэш және проекциялар: жиі оқылатын - қысқа TTL және оқиғалық мүгедектігі бар cache-aside.
Batch-паттерндер: сыртқы шақыруларды топтастырыңыз (мысалы, провайдер лимиттерін N мс-де бір рет сұрату).
Серияландыру: жылдам кодектер (protobuf/msgpack); JSON тек edge.
10) ДБ бақылауда
Қосылыстар пулдары: жоғарғы шекаралары (ядролар/IO негізге алына отырып), пулға кезектер қосылған.
Индекстер мен жоспар: p95 explain + жоспарларды регрессиялау автотестері.
Сұраулардың уақыты: қысқа, 'statement _ timeout' (Postgres).
Hot rows/locks: кілт бойынша шардалау, оптимистік бұғаттау (баланс нұсқасы), «монолитті» транзакцияның орнына saga.
11) WebSocket/real-time
Тарату шектегіші: batched broadcast, max msgs/sec per connection.
Ішкі backpressure: қапшығы бар шығыс хабарламалар кезегі; толу кезінде - drop low-priority.
Sticky-routing және PDB - reconnect-дауылды тудырмау үшін.
12) Болжамдау үшін бақылау
Өлшемдері (RED/USE + backpressure):- 'request _ rate', 'error _ ratio', 'latency _ p95/p99' бағыттары бойынша.
- `queue_depth`, `lag_seconds`, `consumer_inflight`, `retries_total`, `dlq_rate`.
- `backpressure_drops`, `admission_rejects`, `circuit_open`.
- Для БД: `connections_in_use/max`, `locks`, `slow_queries`.
- Трестер: span 'queue → worker → db/psp' tag 'operation _ id', 'partition', 'retry'.
- Логтар: құрылымдық, с 'trace _ id', PII жоқ; жеке оқиғалар «open/close circuit».
13) Жүктемемен тестілеу
Жарқылдауға арналған Open-model (arrivals/sec); Сессиялар үшін Closed-model (VUs).
Профильдер: қысқа burst 60-120 с және soak 1-4 сағ.
Бас тарту инъекциялары: сыртқы API-ні + 200-500 мс баяулатыңыз, р99/ретраи/кезекке қараңыз.
Жасыл аймақ өлшемдері: 'queue _ lag', тұрақты p95, 'dlq _ rate ≈ 0'.
14) Қауіпсіздік және сенімділік
TLS/mTLS бойынша кезектер, хабарламалардың қолы, схеманы бақылау (Euro/Protobuf + Schema Registry).
Idempotent producer (Kafka), exactly-once tx ақталған жерде.
Хаос-режим: тәуелділікті дүркін-дүркін «түсіріңіз» және тозуға қараңыз (circuit, fallback).
15) Конфигурацияның «кесектерінің» мысалдары
Nginx/Envoy кіріс шейпингі:nginx limit_req_zone $binary_remote_addr zone=api:10m rate=20r/s;
server {
location /api/ {
limit_req zone=api burst=40 nodelay;
proxy_read_timeout 0. 6s; # SLO-дан қысқа proxy_connect_timeout 0. 2s;
}
}
basic. qos (prefetch_count = 32) # CPU/IO теңгеріміjava props. put(ConsumerConfig. MAX_POLL_RECORDS_CONFIG, 200);
props. put(ConsumerConfig. FETCH_MAX_BYTES_CONFIG, 5_000_000);
props. put(ConsumerConfig. MAX_POLL_INTERVAL_MS_CONFIG, 60_000);16) Енгізу чек-парағы (prod-ready)
- Сыни жолдар синхронды және асинхронды өңдеуге (SEDA) бөлінген.
- Admission control және сыртқы тәуелділікке бәсекелестік лимиттері.
- Тайм-ауттар SLO-дан қысқа; экспонентасы және джиттері бар ≤ 2 ретраялары; коалессинг.
- Circuit breaker + деградация (кэш/стаб), half-open саясаты.
- Кезектер/ағындар: prefetch/in-flight, DLQ, кілттер бойынша партиялар.
- Ұқсастық (operation_id/Idempotency-Key), Outbox/Inbox, дедупликация.
- Кэш: cache-aside, қысқа TTL + оқиға мүгедектігі.
- БД: пулдар лимиттері, statement_timeout, индекстер, анти-lock стратегиялары.
- WS: хабарламалар лимиттері, батчинг, sticky-routing, PDB.
- Бақылау: backpressure/queues/retries өлшемдері, end-to-end трейлері, дашбордтар.
- Жүктеме және істен шығу тестілері (open + closed, burst + soak), жасыл аймақ критерийлері.
Түйіндеме
Жылдам бэкенд - бұл «басқа кэш жасау» емес, басқарылатын ағын: кіру шектеулі, ауыр - фонға, кезек пен лимиттердің әрбір кезеңі, ретрайлер сирек және ақылды, ал тізбектер circuit breaker және демпотенттікпен қорғалған. Тайм-ауттар тәртібін, бақылаушылықты және тұрақты стресс-тестілерді қосыңыз - және сіздің p95/p99 тіпті сыртқы провайдерлердің бурстары мен каприздері астында жасыл болып қалады.
