GH GambleHub

Hodisa arxitekturasi

Hodisa arxitekturasi (EDA)

1) Hodisa nima va nega EDA

Hodisa - bu allaqachon domenda («PlayerVerified», «PaymentCaptured») sodir bo’lgan o’zgarmas fakt. EDA ushbu faktlarni va ularga munosabatlarni e’lon qilish atrofida integratsiyalashadi:
  • xizmatlarning zaif bog’liqligi,
  • iste’molchilarni mustaqil ravishda,
  • proyeksiyalarni replay/qayta qurish,
  • shaffof audit.

EDA sinxron APIlarni bekor qilmaydi - ular asinxron qatlamga kross-servis qaramligini olib, ularni to’ldiradi.


2) Voqealar turlari

Domen: muhim biznes faktlari (OrderPlaced, BonusGranted).
Integratsiyalashgan: tashqi tizimlar uchun «rasmlar «/oʻzgarishlar (UserUpdated, WalletBalanceChanged).
Texnik: hayot sikli va telemetriya (Heartbeat, PipelineFailed).
Buyruqlar (hodisa emas, balki yonma-yon): «Xni qil» (CapturePayment).

Tavsiya: domen voqealari - birlamchi; integratsiyalashuv aniq iste’molchilar uchun proyeksiyalar bilan shakllantiriladi.


3) Voqealar kontraktlari va sxemalari

Схема: Avro/Protobuf/JSON Schema + Schema Registry; muvofiqlik strategiyasi: «BACKWARD» iste’molchilar evolyutsiyasi uchun, «FULL» tanqidiy mavzularda.
CloudEvents (id, source, type, time, subject, datacontenttype) - bir xil sarlavhalar.
Majburiy meta maʼlumotlar:’event _ id’(ULID/UUID),’occurred _ at’,’producer’,’schema _ version’,’correlation _ id ’/’ causation _ id’,’idempotency _ key’.
Versionlash: add-only maydonlari, nomini oʻzgartirish/semantik buzishni taqiqlash; yangi turlari - yangi mavzular/turlar.

Misol (Yevro, parcha):
json
{
"type":"record","name":"PaymentCaptured","namespace":"events.v1",
"fields":[
{"name":"event_id","type":"string"},
{"name":"occurred_at","type":{"type":"long","logicalType":"timestamp-micros"}},
{"name":"payment_id","type":"string"},
{"name":"amount","type":{"type":"bytes","logicalType":"decimal","precision":18,"scale":2}},
{"name":"currency","type":"string"},
{"name":"player_id","type":"string"}
]
}

4) Yetkazib berish, tartib va kelishuv

At-least-once defolt sifatida → ishlov beruvchilarning idempotentligi kerak.
Tartib: partiya (Kafka) yoki navbat (RabbitMQ) ichida kafolatlanadi, lekin retralarda buzilishi mumkin; hodisa kaliti tartib domen granulasini aks ettirishi kerak (masalan,’player _ id’).
Muvofiqlik: pul/kreditlar uchun - faqat jurnallar/saglar/kompensatsiyalar orqali; LWW dan qoching.

O’qish modeli: proyeksiyalar va keshlar eventual bo’lishi mumkin - «yangilanish davom etmoqda»... ni ko’rsating va qat’iy yo’llar uchun RNOT strategiyalaridan foydalaning.


5) Outbox/Inbox и CDC

Outbox: xizmat o’zining ma’lumotlar bazasiga haqiqatni yozadi va outbox jadvaliga bitta tranzaksiyada → vorker shinaga joylashtiradi.
Inbox: isteʼmolchi’event _ id’ni dedup uchun qayta ishlash natijasi bilan saqlab qoladi.
CDC (Change Data Capture): ilovani oʻzgartirmasdan integratsiya qilish uchun DB (binlog/WAL) dan shinaga oʻzgarishlar oqimi.
Idempotency:’idempotency _ key ’/’ event _ id’boʻyicha ishlov berish.


6) CQRS и Event Sourcing

CQRS: write-model va read-proyeksiyalarni baham ko’ring; proyeksiyalar voqealardan tuziladi va orqada qolishi mumkin.
Event Sourcing: agregat holati = uning voqealari. Ijobiy tomonlari: to’liq audit/replay; minuslar: migratsiya/sxema/snapshot murakkabligi.
Amaliyot: ES - hamma joyda emas, tarix va kompensatsiya muhim bo’lgan joylarda; CQRS - deyarli har doim EDAda.


7) Dostonlar: orkestr va xoreografiya

Orkestr: muvofiqlashtiruvchi buyruqlar yuboradi va javob-hodisalarni kutadi; murakkab jarayonlar uchun qulay (KYC → Deposit → Bonus).
Xoreografiya: xizmatlar bir-birining voqealariga munosabat bildiradi; oson, lekin kuzatish qiyinroq.
Har doim kompensatsiya va muddatlarni belgilang.


8) Topologiyalarni loyihalash (Kafka/RabbitMQ)

Kafka

Domen hodisasi:’payments. captured. v1`, `players. verified. v1`.
Partiyalash kaliti:’player _ id ’/’ wallet _ id’- tartib muhim boʻlgan joyda.
`replication. factor=3`, `min. insync. replicas = 2’, prodyuser’acks = all’.
Retention: vaqt boʻyicha (masalan, 7-90 kun) va/yoki compaction (kalit boʻyicha oxirgi holat).
Backoff bilan retry va DLQ uchun topiklar.

RabbitMQ

Exchanges: `topic`/`direct`, routing key `payments. captured. v1`.
Keng fan-out uchun -’topic’+ bir necha navbat; RPC/jamoalar uchun - alohida navbatlar.
HA uchun Quorum Queues; Retraylar uchun TTL + dead-letter exchange.


9) Kuzatish va SLO EDA

SLI/SLO:
  • End-to-end latency (occurred_at → qayta ishlangan): p50/p95/p99.
  • Lag/age: iste’molchilarning orqada qolishi (Kafka consumer lag, Rabbit backlog age).
  • Nashr/qayta ishlash usuli.
  • DLQ-rate va takrorlash ulushi.
  • Biznes-operatsiyalarning muvaffaqiyati (masalan, «depozit 5s ≤ tasdiqlangan»).
Amaliyot:
  • Voqealarni’trace _ id ’/’ correlation _ id’(OTel) orqali bogʻlash.
  • Metrik trassadan (exemplars) nusxalar.
  • «Producer → Broker → Consumer» dashbordlari burn-rate alertlari bilan.

10) Repley, retenshn va backfill

Proyeksiya/xatolarni tuzatish uchun replay: yangi proyeksiya/neyspeysga haydang, so’ngra o’qishni o’zgartiring.
Retenshn: yuridik/biznes talablari (GDPR/PCI); sezgir maydonlar - shifrlang va/yoki tokenlang.
Backfill: bir martalik mavzular/navbatlar, RPSning aniq chegaralari.


11) Xavfsizlik va komplayens

TLS in-transit, mTLS ichki mijozlar uchun.
Avtorizatsiya: per-topic/per-exchange ACL; multitenancy namespace/vhost orqali.
PII: hodisadagi maydonlarni minimallashtirish; envelope meta ma’lumotlar alohida, foydali yuklamalarni zarur bo’lganda shifrlash.
Voqealarga kirish auditi, «hamma narsaga qodir» kalitlarni taqiqlash.
Retenshn siyosati va oʻchirish huquqi (GDPR): maʼlumot bogʻlamalarini yoki tombstone hodisalarini va oʻchirishni proyeksiyalarda saqlang.


12) EDAda test sinovi

Contract tests: Iste’molchilar o’zlarining sxemalarini (consumer-driven) tasdiqlaydilar.
Replay-testlar: yangi ishlov beruvchi/sxema versiyasi orqali tarixiy tanlash.
Chaos stsenariylari: brokerning kechikishi/yo’qolishi, uzellarning yiqilishi, iste’molchining orqada qolishi → SLO doirasida qoladi.
CIdagi smoke: vaqtinchalik mavzularda qisqa end-to-end paypline.


13) «CRUD-integratsiyalar → EDA» migratsiyasi

1. Domen faktlarini aniqlang.
2. Outboxni boshlangʻich xizmatlarga kiriting.
3. Minimal domen hodisalarini nashr eting va 1-2 ta proyeksiyani ulang.
4. Sinxron integratsiyalarni obunalar bilan almashtirish orqali asta-sekin oʻchiring.
5. Schema registry va moslashuv siyosatini kiriting.
6. Voqealarni add-only bilan kengaytiring; parchalar - faqat yangi turlar orqali.


14) Anti-patternlar

Hodisalar = «DTO API» (juda yog’li, ichki modelga bog’liq) - iste’molchilarni buzadi.
Schema Registry va muvofiqligi yo’qligi - «mo’rt» integratsiya.
Koddan nashr etish va DBga yozish atom emas (outbox yoʻq) - voqealarni yoʻqotasiz.
«Exactly-once hamma joyda» - foydasiz yuqori narx; yaxshiroq at-least-once + idempotentlik.
Partiyalashning bitta «universal» kaliti → qizg’in partiya.
Prod-proyeksiyaga to’g’ridan-to’g’ri gapirish - onlayn SLOlarni buzadi.


15) Joriy etish chek-varaqasi (0-45 kun)

0-10 kun

Domen hodisalari va ularning kalitlarini (tartib granulalari) aniqlash.
Shema registrini kengaytirish va muvofiqlik strategiyasini tasdiqlash.
1-2 servisga outbox/inbox qoʻshish; minimal CloudEvents-envelope.

11-25 kun

Retry/DLQ, backoff, ishlov beruvchilarning idempotentligini kiritish.
Dashbordlar: lag/age/end-to-end; burn-rate alerta.
Hodisa hujjatlari (katalog), owner’lar va sxemalarni tahrirlash jarayonlari.

26-45 kun

Birinchi proyeksiyani replay/qayta qurish; runbook replay va backfill.
Xavfsizlik siyosati (TLS, ACL, PII), retenshn, GDPR-protseduralar.
Broker va iste’molchilar uchun muntazam chaos-va game-days.


16) Etuklik metrikasi

Domen hodisalarining 100% sxemalar bilan tavsiflangan va roʻyxatdan oʻtgan.
Outbox/inbox Tier-0/1 barcha ishlab chiqaruvchilari/konsumerlarini qamrab oladi.
SLO: p95 end-to-end latency va consumer lag maqsadlar doirasida ≥ 99%.
Replay/Backfill to’xtovsiz amalga oshirilishi mumkin; tekshirilgan runbook’lar mavjud.
Versionlash: yangi maydonlar - sinmasdan; eski iste’molchilar tushmaydi.
Xavfsizlik: TLS + mTLS, ACL per topic, kirish jurnallari, PII/retenshn siyosati.


17) Mini-snippetlar

Kafka Producer (ishonchli nashr, g’oyalar):
properties acks=all enable.idempotence=true max.in.flight.requests.per.connection=1 compression.type=zstd linger.ms=5
Consumer-ishlov beruvchi (idempotentlik, psevdokod):
python if inbox.contains(event_id): return # дедуп process(event)            # побочные эффекты детерминированы inbox.commit(event_id)        # atomically with side-effect commit_offset()
DLX (g’oya) orqali RabbitMQ Retry:
  • `queue: tasks` → on nack → DLX `tasks. retry. 1m’(TTL = 60s) → qaytish’tasks’; keyingi o’rinlarda’5m/15m’deb ataladi.

18) Xulosa

EDA integratsiyani aniq shartnomalar va boshqariladigan muvofiqlikka ega biznes-faktlar oqimiga aylantiradi. Poydevor qo’ying: sxemalar + reyestr, outbox/inbox, tartib kalitlari, idempotent ishlov beruvchilar, SLO va kuzatish qobiliyati, xavfsiz retenshn va replay. Shunda voqealar sizning «haqiqat manbangizga» aylanadi.

Contact

Biz bilan bog‘laning

Har qanday savol yoki yordam bo‘yicha bizga murojaat qiling.Doimo yordam berishga tayyormiz.

Integratsiyani boshlash

Email — majburiy. Telegram yoki WhatsApp — ixtiyoriy.

Ismingiz ixtiyoriy
Email ixtiyoriy
Mavzu ixtiyoriy
Xabar ixtiyoriy
Telegram ixtiyoriy
@
Agar Telegram qoldirilgan bo‘lsa — javob Email bilan birga o‘sha yerga ham yuboriladi.
WhatsApp ixtiyoriy
Format: mamlakat kodi va raqam (masalan, +998XXXXXXXX).

Yuborish orqali ma'lumotlaringiz qayta ishlanishiga rozilik bildirasiz.