Waka arhitekturasy
Waka arhitekturasy (EDA)
1) Waka näme we näme üçin EDA
Bu waka eýýäm domende bolup geçen üýtgewsiz hakykat ("PlayerVerified", "PaymentCaptured"). EDA bu faktlary we olara bolan reaksiýalary çap etmegiň töwereginde integrasiýalary gurýar:- hyzmatlaryň gowşak baglanyşygy,
- sarp edijileri özbaşdak ulaltmak,
- proýeksiýalary gaýtalamak/üýtgedip gurmak,
- aç-açan audit.
EDA sinhron API-leri ýatyrmaýar - olary tamamlaýar, asinkron gatlagyna kross-hyzmat garaşlylygyny çykarýar.
2) Wakalaryň görnüşleri
Domen: möhüm işewürlik faktlary (OrderPlaced, BonusGranted).
Integrasiýa: daşarky ulgamlar üçin "suratlar "/üýtgeşmeler (UserUpdated, WalletBalanceChanged).
Tehniki: Durmuş sikli we telemetriýa (Heartbeat, PipelineFailed).
Buýruklar (waka däl, ýöne golaýda): "X et" (CapturePayment) görkezmeleri.
Maslahat: domen hadysalary - ilkinji; integrasiýalar anyk sarp edijiler üçin proýeksiýalar arkaly emele gelýär.
3) Wakalaryň şertnamalary we shemalary
Схема: Avro/Protobuf/JSON Schema + Schema Registry; gabat gelmek strategiýasy: "BACKWARD" sarp edijileriň ewolýusiýasy üçin, "FULL" möhüm mowzuklarda.
CloudEvents (id, source, type, time, subject, datacontenttype) - birmeňzeş sözbaşy.
Hökmany meta-maglumatlar: 'event _ id' (ULID/UUID), 'occurred _ at', 'producer', 'schema _ version', 'correlation _ id '/' causation _ id', 'idempotency _ key'.
Wersiýalaşdyrmak: add-only meýdanlary, adyny üýtgetmegi/semantik döwmegi gadagan etmek; Täze görnüşler - täze mowzuklar/görnüşler.
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) Eltip bermek, tertip we ylalaşyklylyk
At-least-once defolt hökmünde → prosessorlaryň idempotentligi zerurdyr.
Tertip: partiýanyň (Kafka) ýa-da nobatyň (RabbitMQ) içinde kepillendirilýär, ýöne retrada bozulyp bilner; Wakanyň açary düzgüniň domen granulasyny görkezmelidir (mysal üçin 'player _ id').
Ylalaşyk: pul/karzlar üçin - diňe žurnallar/saga/kompensasiýa arkaly; LWW-den gaça duruň.
Okamak modeli: proýeksiýalar we keşler eventual bolup biler - "täzelenýär"... görkeziň we berk ýollar üçin RNOT strategiýalaryny ulanyň.
5) Outbox/Inbox и CDC
Outbox: Hyzmat hakykaty öz DB-sine we bir geleşikdäki outbox tablisasyna ýazýar → worker tekerde çap edýär.
Inbox: Sarp ediji 'event _ id' -ni dadup üçin gaýtadan işlemegiň netijesi bilen saklaýar.
CDC (Change Data Capture): Programmany üýtgetmezden integrasiýalary gurmak üçin DB (binlog/WAL) -den tekere üýtgeşmeler akymy.
Idempotency: 'idempotency _ key '/' event _ id' boýunça gaýtadan işlemek, kesgitlenýänçä daşarky dünýäni üýtgetmäň.
6) CQRS и Event Sourcing
CQRS: write modelini we read-proýeksiýalaryny bölýäris; proýeksiýalar wakalardan gurlupdyr we yza galyp biler.
"Event Sourcing": agregatyň ýagdaýy = onuň wakalarynyň jemlenişi. Plýuslar: doly audit/bellik; minuslar: migrasiýa/shemalar/snapshot çylşyrymlylygy.
Tejribe: ES - hemme ýerde däl, taryh we kompensasiýa möhüm bolan ýerlerde; CQRS - hemişe diýen ýaly EDA-da.
7) Saglar: orkestr we horeografiýa
Orkestr: koordinator buýruklar iberýär we jogap çärelerine garaşýar; çylşyrymly amallar üçin amatly (KYC → Deposit → Bonus).
Horeografiýa: hyzmatlar biri-biriniň wakalaryna reaksiýa bildirýärler; aňsat, ýöne yzarlamak has kyn.
Elmydama öwezini dolmagy we ädimleriň möhletini kesgitläň.
8) Topologiýalaryň dizaýny (Kafka/RabbitMQ)
Kafka
Domen wakasy: 'payments. captured. v1`, `players. verified. v1`.
Partiýa açary: 'player _ id '/' wallet _ id' - tertip möhüm bolan ýerde.
`replication. factor=3`, `min. insync. replicas = 2 ', prodýuser' acks = all '.
Retention: wagt (mysal üçin 7-90 gün) we/ýa-da compaction (açar boýunça iň soňky ýagdaý).
Backoff bilen retry we DLQ üçin topikler.
RabbitMQ
Exchanges: `topic`/`direct`, routing key `payments. captured. v1`.
Giň janköýer üçin - 'topic' + birnäçe nobat; RPC/toparlar üçin - aýratyn nobatlar.
HA üçin Quorum Queues; Retraýlar üçin TTL + dead-letter exchange.
9) Syn etmek we SLO EDA
SLI/SLO:- End-to-end latency (occurred_at → işlenildi): p50/p95/p99.
- Lag/age: sarp edijileriň yza galmagy (Kafka consumer lag, Rabbit backlog age).
- Throughput neşir/gaýtadan işlemek.
- DLQ-rate we gaýtalamalaryň paýy.
- Işewürlik amallarynyň üstünligi (mysal üçin, "goýum 5c ≤ tassyklandy").
- 'trace _ id '/' correlation _ id' (OTel) arkaly wakalaryň baglanyşygy.
- Nusgalar (exemplars) metriklerden → trassadan.
- Burn-rate alertleri bolan "Producer → Broker → Consumer" dashbordlary.
10) Bellik, retenşn we backfill
Proýeksiýalary täzeden gurmak/bökdençlikleri düzetmek üçin gürlemek: täze proýeksiýa/nomespace sürüň, soň okamaga geçiň.
Retenşn: hukuk/iş talaplary (GDPR/PCI); duýgur meýdanlar - şifrläň we/ýa-da belläň.
Backfill: bir gezek ulanylýan mowzuklar/nobatlar, önümi bogup öldürmezlik üçin aç-açan RPS çäkleri.
11) Howpsuzlyk we gabat gelmek
Içerki müşderiler üçin TLS in-transit, mTLS.
Ygtyýarnama: per-topic/per-exchange ACL; namespace/vhost arkaly multitenancy.
PII: wakada meýdanlary azaltmak; envelope meta-maglumatlar aýratyn, zerur bolsa peýdaly ýükleri şifrlemek.
Wakalara girmegiň barlagy, "mümkin bolan" açarlary gadagan etmek.
Retenşn syýasaty we aýyrmak hukugy (GDPR): ýa-da maglumat baglanyşyklaryny ýa-da tombstone-wakalary saklaň we proýeksiýalarda aýyryň.
12) EDA-da synag
Contract tests: sarp edijiler shemalara garaşýandyklaryny tassyklaýarlar (consumer-driven).
Replay-testler: Täze prosessor/shema wersiýasy arkaly taryhy nusganyň geçmegi.
Chaos-ssenariler: brokeriň gijikdirilmegi/ýitmegi, düwünleriň ýykylmagy, sarp edijiniň yza galmagy → SLO çäklerde galýar.
CI-de smoke: wagtlaýyn mowzuklarda gysga ahyrdan soňa.
13) Göçmek "CRUD-integrasiýalary → EDA"
1. Domen faktlaryny kesgitläň.
2. Outbox-y başlangyç hyzmatlara giriziň.
3. Iň az domen wakalaryny çap ediň we 1-2 proýeksiýany birikdiriň.
4. Nokat sinhron integrasiýalaryny abuna ýazgylary bilen çalşyp, kem-kemden öçüriň.
5. Schema registry we laýyklyk syýasatyny giriziň.
6. Wakalary add-only meýdanlar bilen giňeldiň; döwmek - diňe täze görnüşler arkaly.
14) Anti-patternler
Wakalar = "DTO API" (gaty ýagly, içerki modeline bagly) - sarp edijileri bozýar.
Shema Registry we gabat gelmezlik - "gowşak" integrasiýa.
Koddan çap etmek we DB-e ýazmak atomar däl (ýok outbox) - wakalary ýitirýärsiňiz.
"Exactly-once hemme ýerde" - peýdasyz ýokary baha; has gowy at-least-once + idempotentlik.
Bir "ähliumumy" partizasiýa açary → gyzgyn partiýa.
Proýeksiýa göni gürlemek - onlaýn SLO-lary döwýär.
15) Giriş çek-sanawy (0-45 gün)
0-10 gün
Domen wakalaryny we olaryň açarlaryny (sargyt granullary) kesgitlemek.
"Schema Registry" -ni ýerleşdirmek we laýyklyk strategiýasyny tassyklamak.
1-2 hyzmatyna outbox/inbox goşmak; iň az CloudEvents-envelope.
11-25 gün
Retry/DLQ, backoff, prosessorlaryň deňsizligini giriň.
Daşbordlar: lag/age/end-to-end; burn-rate alert.
Wakalaryň resminamalaşdyrylyşy (katalog), owner's we shemalary täzeden gözden geçirmek prosesi.
26-45 gün
Birinji proýeksiýany göçürmek/üýtgedip gurmak; runbook replay we backfill.
Howpsuzlyk syýasaty (TLS, ACL, PII), retenşn, GDPR-amallar.
Broker we sarp edijiler üçin yzygiderli chaos-we game-days.
16) Kämillik ölçegleri
Domen wakalarynyň 100% -i diagrammalar bilen beýan edildi we hasaba alyndy.
Outbox/inbox ähli prodýuserler/konsumerler bilen örtülendir Tier-0/1.
SLO: p95 end-to-end latency we consumer lag maksatlaryň içinde ≥ 99%.
Replay/Backfill aşaklamasyz amala aşyrylyp bilner; barlanan runbook bar.
Wersiýalaşdyrmak: täze meýdanlar - döwülmezden; köne sarp edijiler ýykylmaýarlar.
Howpsuzlyk: TLS + mTLS, ACL per topic, giriş magazinesurnallary, PII/retenşn syýasaty.
17) Kiçi snippetler
Kafka Producer (ygtybarly neşir, pikirler):properties acks=all enable.idempotence=true max.in.flight.requests.per.connection=1 compression.type=zstd linger.ms=5
Ulanyjy-prosessor (idempotentlik, psevdokod):
python if inbox.contains(event_id): return # дедуп process(event) # побочные эффекты детерминированы inbox.commit(event_id) # atomically with side-effect commit_offset()
DLX (ideýa) arkaly RabbitMQ Retry:
- `queue: tasks` → on nack → DLX `tasks. retry. 1m '(TTL = 60s) → yzyna gaýtarmak' tasks '; ondan soň '5m/15m'.
18) Netijenama
EDA integrasiýany anyk şertnamalar we dolandyrylýan sazlaşyk bilen işewürlik faktlarynyň akymyna öwürýär. Binýady guruň: shemalar + reýestr, outbox/inbox, tertip açarlary, idempotent prosessorlary, SLO we gözegçilik, ygtybarly retenşn we bellik. Şonda wakalar ulalmak, seljermek we täze keşpler üçin - gowşak baglanyşyklar we gijeki göçmeler bolmazdan "hakykat çeşmesi" bolar.