GH GambleHub

Event Sourcing: Esaslar

"Event Sourcing" näme?

"Event Sourcing" (ES) - domen obýektleriniň ýagdaýyny "häzirki setir" görnüşinde däl-de, bolup geçen zatlaryň hemmesini beýan edýän wakalaryň üýtgemeýän magazineurnaly hökmünde saklamagyň usulydyr. Agregatyň häzirki ýagdaýy onuň wakalarynyň bukulmagy (replay) bilen alynýar, okamak üçin islendik görkezmeler bolsa şu žurnalyň üstündäki proýeksiýa hökmünde gurulýar.

Esasy netijeler:
  • Taryh - "hakykatyň esasy çeşmesi", döwlet - taryhyň proýeksiýasy.
  • Islendik ýagdaýy täzeden görkezip, barlap we düşündirip bolýar (audit).
  • Täze pikirleri we analitikleri goşmak köne "suratlaryň" göçmegini talap etmeýär - wakalary ýitirmek ýeterlikdir.

Esasy adalgalar

Agregat - anyk üýtgewsizler bilen utgaşdyrylan domen birligi (Order, Payment, UserBalance).
Waka - geçmişde bolup geçen üýtgewsiz hakykat ('payment. authorized`, `order. shipped`).
"Event Store" - agregatyň çägindäki wakalaryň tertibini üpjün edýän append-onli magazineurnaly.
Agregatyň wersiýasy - iň soňky ulanylan wakanyň belgisi (optimistic concurrency üçin).
Snapshot - bukulmagy çaltlaşdyrmak üçin ýagdaýyň döwürleýin möhüri.
Proýeksiýa (read-model) - okamak/gözlemek/hasabat bermek üçin materiallaşdyrylan görnüş (köplenç - asinxron).

Nähili işleýär (toparlar → wakalar → proýeksiýalar)

1. Müşderi buýrugy iberýär ('CapturePayment', 'PlaceOrder').
2. Agregat inwariantlary tassyklaýar we hemme zat gowy bolsa, wakalary döredýär.
3. Wakalar, wersiýasyny barlamak bilen (optimistic concurrency) "Event Store" -a atom taýdan goşulýar.
4. Proýeksiýa prosessorlary wakalaryň akymyna ýazylýar we read-modelleri täzeleýär.
5. Aşakdaky buýruk üçin agregat ýüklenende ýagdaý dikeldilýär: snapshot (bar bolsa) → snapshot-dan soňky wakalar.

Wakalaryň dizaýny

Hökmany atributlar (ýadro)

json
{
"event_id": "uuid",
"event_type": "payment. authorized. v1",
"aggregate_type": "Payment",
"aggregate_id": "pay_123",
"aggregate_version": 5,
"occurred_at": "2025-10-31T10:42:03Z",
"payload": { "amount": 1000, "currency": "EUR", "method": "card" },
"meta": { "trace_id": "t-abc", "actor": "user_42" }
}
Teklipler:
  • Adynyň ady: 'domain. action. v{major}`.
  • Additivity: täze meýdanlar - köne manysyny üýtgetmezden, goşmaça.
  • Minimalizm: aňsat dikeldilýän maglumatlary köpeltmezden diňe faktlar.

Şertnamalar we shemalar

Shemalary düzüň (Euro/JSON Schema/Protobuf) we CI-de laýyklygy barlaň.
"Döwýän" üýtgeşmeler üçin - wakanyň täze esasy görnüşi we migrasiýa döwri üçin 'v1 '/' v2' -niň paralel çap edilmegi.

Bäsdeşlik elýeterliligi: optimistic concurrency

Düzgün: täze wakalary ýazmak diňe 'expected _ version = = current_version'.

Pseudo:
pseudo load: snapshot(state, version), then apply events > version new_events = aggregate. handle(command)
append_to_store(aggregate_id, expected_version=current_version, events=new_events)
//if someone has already written an event between load and append, the operation is rejected -> retray with reload

Şeýlelik bilen, paýlanan amallar bolmazdan üýtgemeleriň bitewiligini kepillendirýäris.

Snapshotlar (aýlawyň tizlenmegi)

Her N hadysada ýa-da taýmerde snapshot ediň.
Храните `snapshot_state`, `aggregate_id`, `version`, `created_at`.
Snapshot-dan soň wakalary hemişe barlaň we yzarlaň (diňe möhüre ynanmaň).
Snapshotlary çukurdan täzeden döredip boljak görnüşde aýyryň ("jadyly" meýdanlary saklamaň).

Proýeksiýalar we CQRS

ES tebigy ýagdaýda CQRS bilen utgaşýar:
  • Write-model = agregatlar + Event Store.
  • Read-modeller = wakalar bilen täzelenýän proýeksiýalar (Redis kartoçkalary, gözleg üçin OpenSearch, hasabatlar üçin ClickHouse/OLAP).
  • Proýeksiýalar idempotentdir: şol bir "event _ id" -ni gaýtadan işlemek netijäni üýtgetmeýär.

Shemalaryň ewolýusiýasy we laýyklygy

Additive-first: meýdanlary goşuň; görnüşlerini/semantikasyny üýtgetmäň.
Çylşyrymly üýtgeşmeler üçin: wakalaryň täze görnüşlerini çykaryň we proýeksiýa migratorlaryny ýazyň.
Geçiş döwri üçin goşa ýazgyny ('v1' + 'v2') saklaň we ähli proýeksiýalar taýýar bolanda 'v1' -ni aýyryň.

Howpsuzlyk, PII we "ýatdan çykarylmak hukugy"

Taryhda köplenç duýgur maglumatlar bar. Çemeleşmeler:
  • Wakalarda PII-ni azaldyň (maglumatlaryň ýerine kesgitleýjiler, jikme-jiklikler - goralýan taraplarda).
  • Kripto silmek: meýdanlary şifrläň we silmek soralanda açary ýok ediň (waka galýar, ýöne maglumat ýok).
  • Redaksiýa wakalary: 'user. piiredacted. v1 'proýeksiýalarda duýgur meýdanlary çalyşmak bilen (taryh redaktirlemegiň hakykatyny saklaýar).
  • Retensiýa syýasaty: käbir domenler üçin wakalaryň bir bölegini WORM ammarynda arhiwläp bolýar.

Öndürijiligi we ulalmagy

Partiýa ýerleşdirmek: tertibiň içinde möhüm - "aggregate _ id" boýunça partiýa ýerleşdiriň.
Sowuk başlangyç: snapshotlar + wagtal-wagtal "möhürleýji" bukja.
Batch append: Wakalary bir amal bilen toparlanyň.
Proýeksiýa prosessorlary üçin Backpressure we DLQ; lag (wagt we habar sany) ölçäň.
"Event Store" indeksasiýasy: '(aggregate_type, aggregate_id)' we wagt taýdan çalt elýeterlilik.

Synag

Agregatlar üçin Specification tests: "buýruklar → garaşylýan wakalar" ssenarisi.
Projection tests: Wakalaryň akymyny beriň we materiallaşdyrylan ýagdaýy/indeksleri barlaň.
Replayability tests: stenddäki "noldan" proýeksiýalary täzeden gözden geçiriň - netijäniň gabat gelýändigine göz ýetiriň.
Chaos/latency: gijikdirmeleri we goşa injektasiýa ediň, duýgurlygyňyzy barlaň.

Domen mysallary

1) Tölegler

Wakalar: 'payment. initiated`, `payment. authorized`, `payment. captured`, `payment. refunded`.
Invariantlar: 'authorized' bolmasa 'capture' bolmaz; summalar negatiw däl; walýuta üýtgemez.
Proýeksiýalar: "töleg kartoçkasy" (KV), amallary gözlemek (OpenSearch), hasabat (OLAP).

2) Sargytlar (e-commerce)

Wakalar: 'order. placed`, `order. paid`, `order. packed`, `order. shipped`, `order. delivered`.
Invariantlar: ýagdaýlaryň diagrammasy boýunça statuslaryň geçişleri; 'shipped' -den öň ýatyrylyp bilner.
Proýeksiýalar: ulanyjynyň sargytlarynyň sanawy, statuslar boýunça SLA-daşbordlar.

3) Balanslar (maliýe/iGaming)

Wakalar: 'balance. deposited`, `balance. debited`, `balance. credited`, `balance. adjusted`.
Gaty üýtgeşiklik: balans gitmeýär <0; buýruklar 'operation _ id' -den tapawutlanýar.
Möhüm amallar gönüden-göni agregatdan (berk sazlaşyk), UI proýeksiýadan (eventual) okalýar.

"Event Store" -yň adaty gurluşy (DB-den wariant)

events

`event_id (PK)`, `aggregate_type`, `aggregate_id`, `version`, `occurred_at`, `event_type`, `payload`, `meta`

Indeks: '(aggregate_type, aggregate_id, version)'.

snapshots

`aggregate_type`, `aggregate_id`, `version`, `state`, `created_at`

Indeks: '(aggregate_type, aggregate_id)'.

consumers_offsets

'consumer _ id', 'event _ id '/' position', 'updated _ at' (proýeksiýalar we retlay üçin).

Ýygy-ýygydan soraglar (SSS)

ES-i hemme ýerde ulanmak hökmanymy?
Ýok. ES, audit, çylşyrymly üýtgemeler, köpeltmek ukyby we maglumatlaryň dürli görnüşleri möhüm bolanda peýdalydyr. Simpleönekeý CRUD üçin bu artykmaç.

"Häzirki ýagdaýyň" soraglary barada näme aýdyp bilersiňiz?
Proýeksiýadan (çalt, eventual) ýa-da agregatdan (has gymmat, ýöne berk) okaň. Kritiki amallar adatça ikinji ýoly ulanýarlar.

Kafka/akym brokeri gerekmi?
"Event Store" - hakykat çeşmesi; broker wakalary proýektorlara we daşarky ulgamlara ýaýratmak üçin amatlydyr.

"Unudylmak hukugy" bilen näme etmeli?
PII-ni minimallaşdyrmak, duýgur meýdanlary şifrlemek we proýeksiýalarda kripto-silmek/redaksiýany ulanmak.

Köne maglumatlary nädip göçürmeli?
Retrospektiv hadysalaryň ("re-haýstori") ssenarisini ýazyň ýa-da "ýagdaý-bolşy ýaly" bilen başlaň we wakalary diňe täze üýtgeşmeler üçin çap ediň.

Anti-patternler

"Däp boýunça" "Event Sourcing": domen peýdasyz ulgamy çylşyrymlaşdyrýar.
Fat events: PII we dubllary bolan çişirilen payload 'lar - tormozlar we gabat geliş meseleleri.
Optimistic concurrency: ýaryş wagtynda üýtgeşiklikleriň ýitmegi.
Dikeldip bolmaýan proýeksiýalar: hiç hili repleýa/snapshot → el fiksleri ýok.
Çig CDC domen hadysalary hökmünde: DB shemalarynyň syzmagy we gaty baglanyşyk.
Içerki we integrasiýa wakalaryny garyşdyrmak: durnuklaşdyrylan "penjiräni" çap ediň.

Önümçilik üçin çek sanawy

  • Agregatlar, üýtgeşmeler we wakalar (atlar, wersiýalar, shemalar) kesgitlenildi.
  • "Event Store" agregatyň içinde tertip-düzgüni we optimistic concurrency üpjün edýär.
  • Snapshotlar we olary täzeden gurmak meýilnamasy girizildi.
  • Proýeksiýalar idempotent, DLQ we lagyň metrikleri bar.
  • Shemalar CI-de tassyklanýar, wersiýa syýasaty - resminamalaşdyrylýar.
  • PII azaldylýar, meýdanlar şifrlenýär, "ýatdan çykarmak" strategiýasy bar.
  • Proýeksiýalaryň belligi stendde barlandy; gyssagly dikeldiş meýilnamasy bar.
  • Daşbordlar: appendiň tizligi, lag proýeksiýalary, ulanyş ýalňyşlyklary, retraýlaryň paýy.

Jemi

"Event Sourcing" ulgamyň taryhyny birinji derejeli artefakt edýär: biz faktlary ýazýarys, olaryň ýagdaýyny köpeldýäris we islendik düşünjäni erkin gurýarys. Bu, şemalarda tertip-düzgün, bäsdeşlik gözegçiligi we duýgur maglumatlar bilen başarnykly işlemek şertlerinde audit, üýtgeşmelere garşylygy we analitikanyň çeýeligini üpjün edýär.

Contact

Biziň bilen habarlaşyň

Islendik sorag ýa-da goldaw boýunça bize ýazyp bilersiňiz.Biz hemişe kömek etmäge taýýar.

Integrasiýany başlamak

Email — hökmany. Telegram ýa-da WhatsApp — islege görä.

Adyňyz obýýektiw däl / islege görä
Email obýýektiw däl / islege görä
Tema obýýektiw däl / islege görä
Habar obýýektiw däl / islege görä
Telegram obýýektiw däl / islege görä
@
Eger Telegram görkezen bolsaňyz — Email-den daşary şol ýerden hem jogap bereris.
WhatsApp obýýektiw däl / islege görä
Format: ýurduň kody we belgi (meselem, +993XXXXXXXX).

Düwmäni basmak bilen siz maglumatlaryňyzyň işlenmegine razylyk berýärsiňiz.