Gündə milyonlarla əməliyyatın fail-safe emalını necə qurmaq olar
Məqalənin tam mətni
1) əməliyyatlar üçün fail-safe nə deməkdir
Fail-safe - hər hansı bir nasazlıq vəziyyətinin ya təhlükəsiz dayanma, ya da pul və məlumat itkisi olmadan kompensasiya vəziyyətinə gətirib çıxardığı zaman. Məqsədlər:- «Cüt debet/kreditlər» = 0.
- İtirilmiş əməliyyatlar/hadisələr = 0.
- Gizli/çatdırılma, aydın deqradasiya rejimləri və DR ilə proqnozlaşdırıla bilən SLO.
Əsas - pul invariantları (bir yerdə balans həqiqəti), idempotentlik, hadisələrin razılaşdırılmış çatdırılması.
2) Memarlıq prinsipləri (qısa)
1. Single source of truth: balans və mühasibat - Ledger/Wallet. Ətrafdakı xidmətlər pul deyil, proseslərin vəziyyətini saxlayır.
2. Idempotency everywhere: bütün «qeydlər» əməliyyatları 'Idempotency-Key' qəbul; təkrar eyni nəticəni qaytarır.
3. Çatdırılma zəmanəti ilə hadisə: outbox/CDC, növbələr, DLQ, dedup.
4. Dastanlar və kompensasiyalar, «əl düzəlişləri» deyil.
5. Back-pressure və prioritetlər: sistem yavaşlayır, lakin dağılmır.
6. Default müşahidə: strukturlaşdırılmış qeydlər, treysinq, metriklər.
7. Multi-region və DR: aktiv-aktiv/aktiv-passiv, müntəzəm təlimlər.
3) Referans-topologiya
Edge/API GW ──Command API ──App Service (Sagas)
│           │
│         (Outbox TX)
RateLimit     Outbox Table ──Publisher ──Kafka/Pulsar ──Consumers
│                      │
WAF                     └─DLQ/Replay
│
└─Ledger/Wallet (ACID, idempotent debit/credit)
│
└─CDC/Changefeed ──DWH/BI/ReconAçar yerlər: Outbox (komandanın atom yazısı və «layihə» hadisəsi), Publisher (düz-bir çatdırılma), Consumers (idempotent, dedup-açarı ilə), DLQ/Replay (nəzarət olunan təkrar).
4) Pul invariantları və uyğunluq
Balans həqiqəti - Ledger (ACID, seriyalı əməliyyatlar və ya ciddi hesab qaydası).
Pul əmrləri: 'debit', 'credit', 'hold', 'commit', 'rollback' - idempotentdir.
Birləşdirilmiş proseslər dastanlar kimi qurulur:- 'authorize → settle → credit' (depozit/settlment), 'request → submit → settled/failed' (ödəniş/çıxış), 'refund/void' (kompensasiya).
- Ledger keçərək birbaşa balans düzəlişləri yoxdur.
5) İdempotentlik: açar dizaynı
Açar birmənalı olaraq biznes əməliyyatını müəyyən etməlidir:- `bet_id+amount+currency`, `payment_intent+capture_id`, `payout_id`, `chain_txid`.
- Nəticəni (response cache) ilə saxlayın. Eyni açar → eyni body/status ilə təkrar.
- Uyğunsuzluğa nəzarət edin: fərqli bir məbləğ ilə eyni açar → 'IDEMPOTENCY _ MISMATCH'.
6) Növbələr, nizam və dedup
Exactly-once effektləri nəqliyyat ilə deyil, idempotent müştəri + dedup-saxlama (LRU/Redis/DB c TTL) ilə əldə edilir.
Açar sırasını saxlayın (partition key = 'account _ id/round _ id/player _ id').
«Müxtəlif» açarlar üçün - state version və kommutatorlar (state machine per entity).
DLQ tələb olunur: N cəhdlərdən sonra - izolyasiya olunmuş mövzuda insan oxuya bilən səbəblə.
7) Outbox/CDC: niyə hadisələr «itirilmir»
Xidmətin DB-də bir əməliyyat çərçivəsində həm biznes dəyişikliyi, həm də outbox-da qeyd edirik.
Ayrı publisher outbox oxuyur və təsdiq ilə şin dərc edir.
Alternativ - CDC (Change Data Capture) DB səviyyəsində (Debezium/log replikasiyaları).
Əməliyyat olmadan heç bir «hadisə log» itki mənbəyidir.
8) Back-pressure və prioritetlər
Token-baketlər və giriş kvotaları (per tenant/brand/region).
Prioritet ilə növbələr: promo/telemetriyadan yuxarı pul yolları.
Həddindən artıq yüklənmə zamanı: 'no new sessions/requests' rejimləri, ikincil fiqurların dondurulması, nüvənin saxlanması.
Avto deqradasiya: arxa plan məsələlərinin tezliyini azaltmaq, dinamik kritik işçilərin genişləndirilməsi.
9) Çox bölgəli sabitlik
API və növbələr üçün aktiv-aktiv, lokal Ledger (və ya region/valyuta ilə qlobal).
Data residency: pul/PII/jurnallar açıq qaydalar olmadan krossovka deyil.
Hadisələrin regionlararası replikasiyası «region» işarəsi ilə asinxronikdir.
RPO/RTO: RPO ≤ 5 dəqiqə, RTO ≤ 30 dəqiqə; mütəmadi yoxlayın.
10) SLO/SLI və dashboard
Göstərişlər (nümunə):- p95 'authorize/debit/credit' <150-300 ms (daxili yol).
- p95 end-to-end «komanda → şin hadisəsi» <1-2 s.
- Webhook/xarici hadisələrin çatdırılması p99 <5 dəq.
- «İtirilmiş/dublyaj edilmiş əməliyyatlar» = 0 (müqavilə yoxlamaları).
Metrlər: latency p50/p95/p99, error-rate (4xx/5xx/business), consumer/queue lag, retry storms, settle lag, webhook lag, DLQ ölçüsü, tezlik 'IDEMPOTENCY _ MISMATCH'.
11) Müşahidə və audit
'trace _ id', 'idempotency _ key', biznes id, səhv kodları ilə strukturlaşdırılmış JSON qeydləri.
OpenTelemetry: Trace HTTP/gRPC/DB/şinlər, span saqa.
WORM-audit: kritik dəyişikliklərin dəyişməz jurnalları (limitlər, açarlar, promo/cekpot konfiqləri).
PII/Secrets Masking, Regional Backets, RBAC/ABAC daxil olmaq.
12) Etibarlılıq testi
Müqavilə testləri: təkrarlama/dublikatlar, out-of-order, idempotentlik, dedup.
Yükləmə: pik profili (x10), növbə dayanıqlığı və DB.
Xaos-cases: Ledger/cüzdan düşməsi, növbə/bölgələr, CDC gecikmələri, «fırtına» retrains.
Game Days: MTTR ölçmə ilə müntəzəm DR və hadisə təlimləri.
13) Anbarlar və məlumatlar
ALTP pul altında: tranzaksiya DB (RPO ≈ 0), ciddi indekslər, kritik varlıqlara görə seriallaşdırıla bilən səviyyələr.
Cache (Redis) - yalnız sürətləndirmək üçün, «həqiqət» üçün deyil. TTL + jitter, cache stampede qarşı müdafiə.
OLAP/DWH - hesabatlar/analitika üçün. CDC/şin axını, ALTP yükü olmadan.
Verilənlər sxemləri versiyalaşdırılır; downtime olmadan miqrasiya (expand/contract).
14) Retraj orkestri
RPC-də eksponent backoff + jitter, deadline/timeout.
Hər təbəqədə idempotent təkrarlama (müştəri → xidmət → istehlakçı).
retrais kvotalar, «fırtınalar» qarşı müdafiə (circuit breaker, uyğun harada hedged requests).
DLQ-dən yalnız «təhlükəsiz» pəncərələrə sürət məhdudiyyəti ilə replay.
15) Nəqliyyat təhlükəsizliyi
mTLS hər yerdə S2S, qısa ömürlü tokenlər (OAuth2 CC), vebhuk üçün cisimlərin imzaları (HMAC/EdDSA).
Vault/HSM sirləri, rotasiya, per brand/region açarları.
least privilege siyasəti, əl əməliyyatları «dörd göz».
16) Nümunəvi müqavilələr (fraqmentlər)
İdempotent debet komandası
POST /v1/wallet/debit
Headers: X-Idempotency-Key: debit_pi_001, X-Trace-Id: tr_a1b2
{
"account_id":"acc_42",  "amount":{"minor_units":5000,"currency":"EUR"},  "reason":"payout",  "reference_id":"po_001"
}
→ 200 { "status":"committed", "entry_id":"e_77" }
(təkrar → eyni cavab)Hadisə outbox
json
{
"event_id":"uuid",  "event_type":"wallet. debit. committed",  "occurred_at":"2025-10-23T16:21:05Z",  "account_id":"acc_42",  "amount_minor":5000,  "currency":"EUR",  "reference_id":"po_001",  "idempotency_key":"debit_pi_001",  "schema_version":"1. 3. 0"
}17) Çek vərəqləri
Platforma/operator
- Balans həqiqəti - bir Ledger; heç bir yol yoxdur.
- 'Idempotency-Key' ilə bütün write əməliyyatları; cavab açar saxlanılır.
- Bütün domen qeydləri, DLQ və replay idarə Outbox/CDC.
- Prioritetlər, back-pressure, deqradasiya rejimləri ilə növbələr.
- Partition-keys biznes açarları ilə seçilir; istehlakçılar idempotentdir.
- SLO-daşbordları, OpenTelemetry, WORM-audit.
- Müntəzəm DR/xaoc təlimləri, müqavilə/yük testləri.
- Data residency, şifrələmə, Vault/HSM, açar rotasiyası.
Provayderlər/inteqrasiya
- Göndərirəm 'Trace-Id '/' Idempotency-Key', yenidən çatdırılmağa hazırdır.
- Webhucks imzalanmış və deduplizasiya edilir.
- Sxemlərin/müqavilələrin versiyalarına riayət olunur (semver, deprecation).
18) Qırmızı bayraqlar (anti-nümunələr)
Balans Ledger-də komanda olmadan webhook-da dəyişir.
İdempotantlığın olmaması → ikiqat debet/kreditlər.
Outbox/CDC keçərək hadisələrin yayımlanması.
Back-pressure olmadan monolit: trafikin zirvəsi hər şeyi vurur.
OLTP və hesabatların qarışdırılması: BI döyüş DB vurur.
DLQ/replay yoxdur; səhvlərin «sakit» udulması.
Heç bir regional PII/pul təcrid; bir neçə marka ümumi açarları.
DB balans/status əl düzəlişləri.
19) Yekun
Gündə milyonlarla əməliyyatın fail-safe emalı invariantlar və intizam haqqındadır: həqiqətin vahid mənbəyi, idempotent komandalar, dastanlar və outbox/CDC, sıra və deadup, müşahidə və idarə olunan deqradasiyalar. Giriş mandatları, DR təcrübələri və müntəzəm təlimlər əlavə edin - və pulun sürətli və yalnız bir dəfə hərəkət etdiyi bir sistem əldə edin, hadisələr itirilmir və trafik artımı və uğursuzluqlar sürprizlər deyil, idarə olunan risklərə çevrilir.
