Backend արձագանքի օպտիմիզացումը 'հերթեր, async, backpressure
1) Ինչո՞ ւ նպատակներ և SLO-ներ
Նպատակը կայուն արագ արձագանք է նույնիսկ պայթյունների ժամանակ։ Բիզնեսը արտահայտում է դա SLO։
API (CRUD/windows): p95-250-400 ms, error rate <1%։
Պլատոգ/սեթլմենտ (asinhrono): ներքին SLA-ն ապացուցելու համար 242-5 րոպե, իսկ հաճախորդը 'ակնթարթային ստանդարտ/Accepted + կարգավիճակը/webhuk։
WS/real-time: RTT p95 ≤ 120 мс, disconnect ≤ 0. 5%.
Բանալին 'տեղադրել «դանդաղ» քայլերը (պրովայդերներ, BD, արտաքին API) հերթից և բեռի գրագետ սահմանափակում։
2) Ռուսական նկարը 'որտե՞ ղ է վերցնում լատենտությունը
Նեղ տեղեր ՝ BD (փամփուշտներ/ինդեքսներ), արտաքին պրովայդերներ (PMS/խաղային), որոնք արգելափակում են I/O, GC/stop աշխարհը, JSON-ի շարքը, «ծանր» միավորումը։
Ախտանիշները 'p99 աճը, հերթը միացված է BD-ին, գետերի աճը, թայմ-աուտները շղթայով (retry storm)։
Անտոն 'ասինխրոն փոխակրիչներ + backpressure + tim-uta/retrai + idempotenty։
3) Asinhrone patters: SEDA և CQRS
SEDA (staged event-driven architecture) 'վերամշակման վերլուծություն փուլում (ingress validation)։ Յուրաքանչյուրն ունի իր հերթը և զուգահեռականության սահմանները։
CQRS 'բաժանեք ընթերցանությունները և գրառումները։ Ձայնագրությունը/հիմքը, կարդալը 'պրոյեկցիաներից/քեշից։
Nobox-ը 'իրադարձությունը հրատարակվում է ատոմային ձայնագրությամբ (խուսափում ենք «կորցրած» հաղորդագրություններից)։
Saga 'երկար բիզնես գործընթացներ, որոնք փոխհատուցում են գործարքները գլոբալ փոխարեն։
4) Հերթեր և հոսանքներ 'ընտրություն և թյունինգ
RabbitMQ/NATS JetStream-ը առաջադրանքների թիմերն են (work queues), Kafka-ը 'իրադարձություններ/սթրիմներ, որոնք ունեն։
Այն փոփոխությունները, որոնք ազդում են արձագանքի վրա
Winfetch/max in-flight: Սահմանափակեք միաժամանակ մշակված հաղորդագրությունների քանակը գողերի վրա (օրինակ, 16-64), որպեսզի չմոռանաք BD/արտաքին API-ը։
Ակեր/կրկնություն '«ack» գաղափարական ձայնագրությունից հետո։ կրկնություններ էքսպոնենցիալ ուշացումով և ջիթերով։
DLQ/parking lot: անթերի գետեր չկան, N-ից հետո փորձերը գնում են Dead Letter Queue-ում։
Կուսակցությունը (Kafka) 'բանալին ըստ էության (userID/txnId) կարգաբերելու համար։ զուգահեռ է կուսակցությունների քանակով։
5) Հակադարձ ճնշումը (backpressure) - ինչպես խեղդվել
Գաղափարը 'ընդունել միայն այնքան, որքան կարող եք մշակել SLO-ի լատենտության սահմաններում։
Տեխնիկան
Admission 24l: Սահմանափակեք մրցակցությունը (semaphore/worker-pool) յուրաքանչյուր արտաքին կախվածության համար 'BD, PSA, խաղի պրովայդեր։
Շեյփինգ 2019: token-bucket/leaky-bucket մուտքի և կրիտիկական երթուղիների վրա։
Գծերը վերին սահմանից 'լրացնելով պոչը (429/503 + Retry-After) կամ թարգմանենք asap-batch։
Adaptive concurrency (AIMD) 'ավելացրեք զուգահեռականությունը հաջողության ժամանակ, նվազեցրեք թայմ-աուտներում։
Circuit Breaker: «closed www.half-open» սխալ/time արտաքին API-ի։ բաց - դեգրադացիա (քաշ/71)։
Կեղծ (Go-նման)
go sem: = make (chan struct +, 64 )//մրցակցության սահմանափակում BD/PSA/PSA
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) Taim-uta, retrai և jitter: «գոյատևման երեք կետեր»
Tim-utes-ը SLO-ից ավելի կարճ է, եթե SLO 400 ms, tim-aut դեպի BD/պրովայդեր 250-300 ms; ընդհանուր Time-aut հարցումը <400-600 ms.
Retrai սահմանափակ և խելացի '1-2 փորձեր max, միայն անվտանգ վիրահատությունների համար (idempotent), էքսպոնենտով և ջիթերով։
Կոալեսինգ 'Համախմբեք կրկնությունները մեկ ստեղնաշարի համար։
Կեղծ (էքսպոնենտ + ջիտթեր)
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) Idempotenty և deduplication
Idempotency-Key-ը HTTP-ում (դեպոզիտներ, վճարումներ), «operation _ id» -ում (յուրահատուկ ինդեքս)։- Inbox/Disbox: Webhuks-ը միշտ անփոփոխ inbox աղյուսակի միջոցով է 'dedu.ru-ով' event _ id; ելքերը գործարքի բանկային բլոկներից են։
- Exactly-once-ը «իմաստալից» է, մենք թույլ ենք տալիս կրկնվող առաքում/կատարումը, բայց ազդեցությունը մեկ է։
8) Արագ API-ը դանդաղ վիրահատությունների համար
Սինխրոն արձագանքը ՝ 201/108 + URL կարգավիճակը ("/status/+ id +), ETA և ռետրայի հուշումներ։
Webhuki/Server-Sent Events/WS-ը պատրաստ է։- Հաճախորդների կարգապահությունը '«Retry-After», idempotenty, հարցման սահմանափակում։
Պատասխանը հետևյալն է
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) Նվազեցնենք աշխատանքը տաք ճանապարհով
Վերցրեք ծանր բաները ֆոնի վրա 'փոխակերպումներ, ագրեգացիաներ, ծանուցումներ, ձայնագրություն CPH-ում։- Քեշը և պրոյեկտները 'հաճախ կարդացածը' cache-aside, կարճ TTL և իրադարձական հաշմանդամություն ունեցող։
- Batch-patters 'խմբավորել արտաքին մարտահրավերները (օրինակ, պրովայդերի սահմանների հարցումը մեկ անգամ N-ում)։
- Սերիզացիա 'արագ ֆորումներ և (wwww.obuf/www.gpack) սերվիզային կապերի համար։ JSON-ը միայն edge-ում է։
10) BD վերահսկողության տակ
Պուլները նշում են. Վերին սահմանները (հիմնվելով միջուկներից/IO), պուլուսի գծերը ներառված են։- Ինդեքսները և պլանը ՝ p95 medain + պլանների ռեգրեսիա։
- Հարցումների թայմ-աուտները 'կարճ, «statium _ timeout» (Postgres)։
- Hot rows/wwww.ks: Շարդինգը բանալին, լավատեսական արգելափակումները (հավասարակշռության տարբերակը), saga-ը «մոնոլիտ» գործարքի փոխարեն։
11) WebSocket/real-time
Տեղադրման սահմանափակիչը 'batched broadcript, max wings/sec per connect։- Ներքին backpressure, առաջացող հաղորդագրությունների հերթը գլխարկով։ հալման ժամանակ 'drop low-priority։
- Sticky-routing-ը և PDB-ը թողարկումների ժամանակ, որպեսզի չվնասեն reconnational-փոթորիկը։
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`.
Թրեյզներ ՝ «queue no worker db/prone» երգերը '«operation _ id», «partrone», «retry»։- Լոգներ ՝ կառուցվածքային, «trace _ id», առանց PII; առանձնահատուկ իրադարձություններ «բաց/close circuit»։
13) Փորձարկումներ բեռի տակ
Բաց-մոդելը (arrivals/sec) աճելու համար։ Closed-մոդելը (VUs) նստաշրջանների համար։- Պրոֆիլներ ՝ 60-120 s կարճ burst և soak 1-4 ռուբլիա
- Մերժումների ներարկումը 'դանդաղեցրեք արտաքին API-ը + 200-500 մզ, նայեք r99/retray/հերթին։
- Կանաչ գոտու չափանիշները 'առանց «queue _ lag» աճի, կայուն p95, «dlq _ rate 240»։
14) Անվտանգությունն ու հուսալիությունը
TFC/mTSA-ի հերթերը, հաղորդագրությունների ստորագրությունը, սխեմայի վերահսկումը (Avro/Medobuf + Schema Registry)։
Idempotent corer (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 _ connational _ timeout 0-ը։ 2s;
}
}
basic. qos (wwww.fetch _ count = 32) # CPU/IO հավասարակշռությունKafka consumer (Java-հատված)
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) Chek-Show-( 2019-ready)
- Քննադատական ճանապարհները բաժանված են սինխրոն արձագանքի և ասինխրոն վերամշակման (SEDA)։
- Admission corl և մրցակցության սահմանները արտաքին կախվածության վրա։
- Թայմ-աուտները SLO-ից կարճ են; trai 242, էքսպոնենտով և ջիտտերով; կոալեսինգը։
- Circuit breaker + դեգրադացիան (cash/2019), half-open քաղաքականությունը։
- Հերթեր/strims: wwww.fetch/in-flight, DLQ, բեկորների կուսակցություն։
- Idempotention (operation _ id/Idempotency-Key), Disbox/Inbox, dedeplication։
- Քաշ 'cache-aside, կարճ TTL + իրադարձական հաշմանդամություն։
- BD: փամփուշտների, ստատիկ _ timeout, ինդեքսներ, հակատիպային ռազմավարություն։
- WS: հաղորդագրությունների սահմանափակումներ, բատչինգ, sticky-routing, PDB։
- Դիտարկումը 'backpressure/queues/retries, end-to-end, dashbords։
- Բեռի և ձախողված թեստերը (բաց + closed, burst + soak), կանաչ գոտու չափանիշները։
Ռեզյումե
Արագ backend-ը ոչ թե «մեկ այլ քեշ» է, այլ վերահսկվող հոսքը ՝ սահմանափակված, ծանր 'ֆոնի վրա, յուրաքանչյուր քայլ' հերթերով և սահմաններով, կտրվածքով հազվագյուտ և խելացի, այլ շղթաները պաշտպանված են circuit breaker և impotenty։ Ավելացրեք թայմ-աուտների կարգապահությունը, դիտարկումը և սթրեսային փորձարկումները, և ձեր p95/p99-ը կմնան կանաչ նույնիսկ բուրգի և արտաքին պրովայդերների պատվաստումների տակ։
