Backend jogabyny optimizirlemek: nobatlar, async, backpressure
1) Näme üçin: maksatlar we SLO
Maksat, hatda partlamalaryň aşagynda-da durnukly çalt jogap. Bu iş SLO-ny beýan edýär:- API (CRUD/kataloglar): p95 ≤ 250-400 ms, error rate <1%.
- Töleg/settlment (asinhron): tassyklamak üçin içerki SLA ≤ 2-5 minut, müşderä bolsa - derrew 202/Accepted + status-poller/webhuk.
- WS/real-time: RTT p95 ≤ 120 мс, disconnect ≤ 0. 5%.
Açar: "haýal" ädimleri (üpjün edijiler, DB, daşarky API) ulanyjy jogabyndan nobatlar we başarnykly ýük çäklendirmeleri arkaly açmak.
2) Esasy surat: gizlinlik nireden alynýar
Dar ýerler: BD (howuzlar/indeksler), daşarky üpjün edijiler (PSP/oýun), I/O, GC/stop-mir, JSON seriýalizasiýasy, "agyr" agregasiýalar.
Alamatlary: p99 beýikligi, DB-e birikmeleriň nobaty, retraý partlamalary, zynjyr (retry storm).
Antidot: asinhron konweýerler + backpressure + wagt-autlar/retrailer + idempotentlik.
3) Asinhron nagyşlar: SEDA we CQRS
SEDA (staged event-driven architecture): gaýtadan işlemegi tapgyra bölüň (ingress → tassyklama → ýazgy → integrasiýa → habar). Her biriniň öz nobaty we paralellik çäkleri bar.
CQRS: Okamalary we ýazgylary bölüň. Ýazgy - journalurnalda/bazada, okamak - proýeksiýalardan/keşlerden.
Outbox: Waka ýazgy bilen bilelikde atom görnüşinde çap edilýär ("ýitirilen" habarlardan gaça durýarys).
Saga: global amallaryň ýerine öwezini dolmak bilen uzyn iş amallary.
4) Nobatlar we akymlar: saýlamak we sazlamak
RabbitMQ/NATS JetStream - Meseleler buýruklary (work queues), Kafka - repli wakalar/akymlar.
Jogaplara täsir edýän sazlamalar:- Prefetch/max in-flight: DB/daşarky API-ni "urmazlyk" üçin bir wagtyň özünde işlenýän worker habarlarynyň sanyny (mysal üçin 16-64) çäklendiriň.
- Aker/gaýtalamalar: 'ack' idempotent ýazgysyndan soň; eksponensial gijikdirme we jitter bilen gaýtalanmalar.
- DLQ/parking lot: uçsyz retraýalar ýok - N synanyşykdan soň Dead Letter Queue gidýär.
- Partiýalaşdyrmak (Kafka): tertipleşdirmek üçin düýp manysy boýunça açar (userId/txnId); partiýalaryň sany arkaly parallelizm.
5) Ters basyş (backpressure) - gark bolmazlyk
Ideýa: diňe SLO-nyň gizlinlik çäklerinde mümkin boldugyça kabul ediň.
Usullar:- Admission control: her bir daşarky garaşlylyk üçin bäsdeşligi (semaphore/worker-pool) çäklendiriň: DB, PSP, oýun üpjün ediji.
- Traffigiň ýaýramagy: token-bucket/leaky-bucket hyzmatyň girelgesinde we möhüm ugurlarda.
- Ýokarky serhedi bolan nobatlar: doldurylanda guýrugyny kesýäris (429/503 + Retry-After) ýa-da asap-batch-e geçirýäris.
- Adaptive concurrency (AIMD): üstünlik gazananyňyzda parallelizmi ösdüriň, wagt autlarynda peseldiň.
- Circuit Breaker: 'closed → open → half-open' ýalňyşlyklar/daşarky API-iň wagt-autlary; open - degradasiýa (kesh/stab).
go sem: = make (chan struct {}, 64 )//DB/PSP bäsdeşlik çäkleri
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) Wagt, retraý we jitter: "üç sany diri galmak kiti"
Wagt-aut SLO-dan gysga: eger SLO 400 ms bolsa, wagt-aut DB/üpjün edijä 250-300 ms; haýyşyň umumy taým-aut <400-600 ms.
Retraýlar çäkli we akylly: 1-2 synanyşyk max, diňe howpsuz amallar üçin (idempotent), eksponent we jitter bilen.
Koalisiýa: bir açar üçin gaýtalamalary jemläň.
Psevdokod (eksponent + jitter):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 UpstreamUnavailable
7) Idempotentlik we duplikasiýa
Idempotency-Key HTTP-e (goýumlar, tölegler), 'operation _ id' DB-e (özboluşly indeks).
Inbox/Outbox: gelýän webhoklar - elmydama 'event _ id' -den 'dedupe' -den üýtgewsiz inbox tablisasy arkaly; gidenler - geleşik boýunça outbox-dan.
Exactly-once "manysy boýunça": gaýtadan eltmäge/ýerine ýetirmäge rugsat berýäris, ýöne bir täsir.
8) Haýal amallar üçin çalt API
Synply jogap: 201/202 + status URL ('/status/{ id} '), ETA we retrai maslahatlar.
Webhuki/Server-Sent Events/WS - taýýar bolanda çaltlyk.
Müşderi düzgün-nyzamy: "Retry-After", idempotentlik, anketanyň çägi.
Jogap mysaly: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) Gyzgyn ýolda işi azaltmak
Agyr zatlary arka tarapa geçiriň: özgerişler, agregasiýalar, habarnamalar, DWH ýazgysy.
Keş we proýeksiýalar: köplenç okalýan - gysga TTL we waka maýyplygy bolan cache-aside.
Batch-patterns: daşarky jaňlary toparlanyň (mysal üçin, üpjün edijiniň çäklerini N ms-de bir gezek soraň).
Serializasiýa: hyzmatara gatnaşyklar üçin çalt kodekler (protobuf/msgpack); JSON diňe edge.
10) DB gözegçilik astynda
Baglanyşyk howuzlary: ýokarky serhetler (ýadro/IO esaslanýar), howuza nobatlar goşulýar.
Indeksler we meýilnama: p95 explain + meýilnamalary regressiýa awtotestleri.
Wagt soraglary: gysga, 'statement _ timeout' (Postgres).
Hot rows/locks: "monolit" amalyň ýerine saga (balans wersiýasy), optimistik blokirleme.
11) WebSocket/real-time
Poçta çäklendiriji: batched broadcast, max msgs/sec per connection.
Içerki backpressure: kaply çykýan habarlaryň nobaty; drop low-priority.
Sticky-routing we PDB çykarylanda - reconnect-tupany döretmezlik üçin.
12) Syn etmek, çaklamazlyk
Metrikler (RED/USE + backpressure):- 'request _ rate', 'error _ ratio', 'latency _ p95/p99' ugurlar boýunça.
- `queue_depth`, `lag_seconds`, `consumer_inflight`, `retries_total`, `dlq_rate`.
- `backpressure_drops`, `admission_rejects`, `circuit_open`.
- Для БД: `connections_in_use/max`, `locks`, `slow_queries`.
- Söwda: span 'queue → worker → db/psp' taglary 'operation _ id', 'partition', 'retry'.
- Loglar: gurluş, 'trace _ id', PII-siz; "open/close circuit".
13) Ýüküň aşagyndaky synag
Aç-model (arrivals/sec) Sessiýalar üçin Closed-model (VUs).
Profiller: gysgaça burst 60-120 s we soak 1-4 sagat.
Näsazlyk sanjymlary: daşarky API-ni 200-500 ms haýalladyň, p99/retrai/nobata serediň.
Ýaşyl zolagyň ölçegleri: 'queue _ lag', durnukly p95, 'dlq _ rate ≈ 0'.
14) Howpsuzlyk we ygtybarlylyk
TLS/mTLS boýunça nobatlar, habarlaryň goly, shema gözegçiligi (Euro/Protobuf + Schema Registry).
Idempotent producer (Kafka), aklanan ýerinde exactly-once tx.
Bulam-bujarlyk: garaşlylygy wagtal-wagtal "taşlaň" we zaýalanmaga serediň (circuit, fallback).
15) Konfigurasiýalaryň "bölekleriniň" mysallary
Nginx/Envoy girişi: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-dan gysga proxy_connect_timeout 0. 2s;
}
}
RabbitMQ (prefetch):
basic. qos (prefetch_count = 32) # CPU/IO balansy
Kafka ulanyjy (Java-bölek):
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) Giriş çek-sanawy (prod-ready)
- Möhüm ýollar sinhron jogap we asinkron bejergisine (SEDA) bölünýär.
- Admission control we daşarky endiklere bäsdeşlik çäkleri.
- Wagt autlary SLO-dan gysga; retrailer ≤ 2, eksponent we jitter bilen; koalisiýa.
- Circuit breaker + degradasiýa (kesh/stab), half-open syýasaty.
- Nobatlar/akymlar: prefetch/in-flight, DLQ, açar partiýasy.
- Idempotentlik (operation_id/Idempotency-Key), Outbox/Inbox, deduplikasiýa.
- Keş: cache-aside, gysga TTL + waka maýyplygy.
- BD: howuz çäkleri, statement_timeout, indeksler, anti-lock strategiýasy.
- WS: habar çäkleri, batching, sticky-routing, PDB.
- Syn edilişi: backpressure/queues/retries metrikleri, end-to-end söwdalary, daşbordlar.
- Ýük we şowsuzlyk synaglary (açyk closed, burst + soak), ýaşyl zolagyň ölçegleri.
Jemleme
Çalt yzyna gaýtarmak "başga bir nagt ýasamak" däl-de, dolandyrylýan akym: giriş çäklidir, agyr - fon, her basgançaga nobat we çäkler, retraýalar seýrek we akylly, zynjyrlar bolsa circuit breaker we dempotentlik bilen goralýar. Wagt-aut tertip-düzgünini, synlanylyşy we yzygiderli stres synaglaryny goşuň - we p95/p99 daşary ýurt üpjün edijileriniň burstlary we kaprizleri astynda ýaşyl bolup galar.