GH GambleHub

CQRS we okamak/ýazmak bölünişi

CQRS näme

CQRS (Command Query Responsibility Segregation) - maglumatlaryň modelini we ýazga (commands) we okamaga (queries) jogapkär komponentleri bölýän binagärlik çemeleşmesi.
Ideýa: ýagdaýy üýtgetmek prosesi hakyky üýtgemeler we amallar üçin, okamak bolsa çalt, maksatly proýeksiýalar we masştablar üçin optimallaşdyrylýar.

💡 Buýruklar ýagdaýy üýtgedýärler we amalyň netijesini yzyna gaýtarýarlar. Haýyşlar diňe okalýar we zyýanly täsirleri ýok.

Näme üçin gerek?

Okamagyň öndürijiligi: anyk ssenariýalara (lentalara, hasabatlara, kataloglara) materiallaşdyrylan proýeksiýalar.
Möhüm ýoluň durnuklylygy: ýazgy "agyr" joinlerden we agregatlardan izolirlenendir.
Ammar saýlamak azatlygy: Ýazmak üçin OLTP, okamak üçin OLAP/kesh/gözleg motorlary.
Çalt ewolýusiýa: amallary "döwmek" howpy bolmazdan täze pikirler goşuň.
Gözegçilik we audit (esasanam "Event Sourcing" bilen bilelikde): ýagdaýy dikeltmek we ýeňmek has aňsat.


Haçan ulanmaly (we haçan ulanmaly däl)

Eger:
  • Dürli maglumat bölekleri we çylşyrymly agregasiýa bilen okamak agdyklyk edýär.
  • Ýazmagyň möhüm ýoly inçe we öňünden aýdyp boljak bolmaly.
  • Okamak we ýazmak üçin dürli SLO/SLA gerek.
  • Ýazmagyň domen logikasyny analitik/gözleg zerurlyklaryndan izolirlemek talap edilýär.
Eger:
  • Domen ýönekeý, ýük az; CRUD başarýar.
  • Okamak bilen ýazmagyň arasyndaky berk sazlaşyk ähli ssenariler üçin hökmanydyr.
  • Topar tejribesiz, operasiýa çylşyrymlylygy kabul ederliksiz.

Esasy düşünjeler

Command: Ýagdaýy üýtgetmek niýeti ('CreateOrder', 'CapturePayment'). Invariantlary barlaýar.
Gözleg (Query): Maglumatlary almak ('GetOrderById', 'ListUserTransactions'). Zyýanly täsirleri ýok.
Ýazgy modeli: agregatlar/üýtgeşmeler/amallar; saklamak - relýasiýa/açar-many/waka log.
Okamak (proýeksiýa) modeli: materiallaşdyrylan tablisalar/indeksler/kesh, sinhronly sinhronlaşdyrylýar.
Gabat gelmek: köplenç ýazgy bilen okamagyň arasynda; möhüm ýollar - write modelinden göni okamak arkaly.


Arhitektura (skelet)

1. Write-hyzmat: buýruklary kabul edýär, üýtgeşmeleri tassyklaýar, üýtgeşmeleri düzedýär (DB ýa-da wakalar).
2. Outbox/CDC: üýtgeşmeler faktynyň kepillendirilen çap edilmegi.
3. Proýeksiýa prosessorlary: Wakalary/CDC diňleýärler we okalýan modelleri täzeleýärler.
4. Read-service: materiallaşdyrylan pikirlerden/keşlerden/gözleglerden queries hyzmat edýär.
5. Saglar/orkestr: kross-agregat proseslerini utgaşdyrýarlar.
6. Syn edilişi: lag proýeksiýalary, üstünlikli ulanylyşlaryň göterimi, DLQ.


Ýazgy modelini düzmek

Agregatlar: geleşikleriň anyk çäkleri (mysal üçin, 'Order', 'Payment', 'UserBalance').
Invariantlar: resmileşdiriň (pul möçberleri ≥ 0, özboluşlylygy, çäkleri).
Buýruklar açar boýunça deňsizdir (mysal üçin 'idempotency _ key').
Geleşikler gurşaw boýunça iň az; daşarky zyýanly täsirleri - outbox arkaly.

Toparyň mysaly (psevdo-JSON)

json
{
"command": "CapturePayment",
"payment_id": "pay_123",
"amount": 1000,
"currency": "EUR",
"idempotency_key": "k-789",
"trace_id": "t-abc"
}

Okamak modelini düzmek

Soraglara esaslanyň: haýsy ekranlar/hasabatlar gerek?
Denormalizasiýa ýol berilýär: read-model - "optimizirlenen keş".
Dürli meseleler üçin birnäçe proýeksiýa: gözleg (OpenSearch), hasabatlar (sütünli ammar), kartoçkalar (KV/Redis).
TTL we gaýtadan ýygnamak: proýeksiýalary çeşmeden dikeldip bilmeli (wakalaryň/snapshotlaryň bellikleri).


Sazlaşyk we UX

Eventual consistency: Interface köne maglumatlary gysga wagtda görkezip biler.
UX-patternleri: "maglumatlar täzelenýär"..., optimistik UI, sinhronizasiýa görkezijileri, tassyklamazdan ozal howply hereketleri blokirlemek.
Güýçli yzygiderliligi talap edýän amallar üçin (mysal üçin, hasapdan çykarmazdan ozal takyk deňagramlylygy görkezmek) write modelinden göni okaň.


CQRS we Event Sourcing (isleg boýunça)

"Event Sourcing" (ES) wakalary saklaýar, agregatyň ýagdaýy bolsa olaryň bukulmagynyň netijesidir.
CQRS + ES bukjasy ajaýyp audit we proýeksiýalaryň aňsat gaýtadan ýygnalmagyny üpjün edýär, ýöne çylşyrymlylygy ýokarlandyrýar.
Alternatiwa: adaty OLTP-BD + outbox/CDC → proýeksiýa.


Köpeltmek: Outbox we CDC

Outbox (bir amalda): domen üýtgeşmelerini ýazmak + wakany outbox-a ýazmak; publişer tekere eltýär.
CDC: DB (Debezium we ş.m.) sanawyndan okamak → domen hadysalaryna öwrülmek.
Kepillikler: at-least-once, sarp edijiler we proýeksiýalar adaty bolmaly.


Ammarlary saýla

Write: amallar üçin relýasiýa (PostgreSQL/MySQL); KV/Document - invariantlar ýönekeý.

Read:
  • KV/Redis - kartoçkalar we çalt açar okalyşlar;
  • Gözleg (OpenSearch/Elasticsearch) - gözleg/süzgüçler/fasetler;
  • Sütünli (ClickHouse/BigQuery) - hasabatlar;
  • CDN üçin kesh - köpçülige açyk kataloglar/mazmun.

Integrasiýa patternleri

API gatlak: "commands" we "queries" üçin aýratyn endpointler/hyzmatlar.
Idempotentlik: sözbaşyda/bedende amal açary; TTL bilen recent-keys saklamak.
Saglar/orkestr: wagt-autlar, öwezini dolmalar, ädimleriň gaýtalanmagy.
Backpressure: proýeksiýa prosessorlarynyň meňzeşligini çäklendirmek.


Syn ediliş

Write metrikleri: p95/99 gizlinlik buýruklary, üstünlikli amallaryň paýy, tassyklama ýalňyşlyklary.
Okamak üçin metrikler: p95/99 soraglar, hit-rate nagt pul, gözleg klasterine ýük.
Proýeksiýalaryň yzy (wagt we habar), DLQ-stawka, de-duplikasiýalaryň göterimi.
Trace: 'trace _ id' → outbox → proýeksiýa → query buýrugy arkaly geçýär.


Howpsuzlyk we laýyklyk

Hukuklary bölmek: ýazmak we okamak üçin dürli skopes/rollar; iň az artykmaçlyklar ýörelgesi.
PII/PCI: proýeksiýalarda iň az; at-rest/in-flight şifrlemek; gizlemek.
Audit: buýrugy, aktýory, netijäni, 'trace _ id' belläň; Möhüm domenler üçin WORM arhiwleri (tölegler, KYC).


Synag

Contract tests: toparlar (ýalňyşlyklar, üýtgeşikler) we kweries (formatlar/süzgüçler) üçin.
Projection tests: Wakalar/CDC seriýasyny beriň we soňky okalýan modelini barlaň.
Chaos/latency: proýeksiýa prosessorlaryna gijikdirmeleri injeksiýa etmek; Lagda UX barlagy.
Replayability: snapshot/logdan stenddäki proýeksiýalary gaýtadan ýygnamak.


Migrasiýa we ewolýusiýa

Täze meýdanlar - hadysada/CDC; read-modeller gaýtadan ýygnalýar.
Şemalaryň täzeden dizaýnynda goşa ýazgy (dual-write); köne proýeksiýalary geçýänçä saklaýarys.
Wersiýa: 'v1 '/' v2' wakalar we endpointler, Sunset-plan.
Feature flags: Kanareýka boýunça täze kweries/proýeksiýalary girizmek.


Antipattern

CQRS ýönekeý CRUD hyzmatlarynda "moda üçin".
Okamagyň ýazuwa berk sinhron garaşlylygy (izolýasiýa we durnuklylygy öldürýär).
Hemme zat üçin bir indeks: birmeňzeş haýyşlary bir read-store-a garyşdyrmak.
Proýeksiýalarda idempotentlik ýok → goşa we gapma-garşylyklar.
Dikeldilmeýän proýeksiýalar (repleýler/snapshotlar ýok).


Domen mysallary

Tölegler (onlaýn hyzmat)

Write: "Authorize", "Capture", "Refund" geleşik DB-de; outbox 'payment' -ni ýerleşdirýär.

Read:
  • Redis UI üçin "töleg kartoçkasy";
  • Hasabatlar üçin ClickHouse;
  • Amallary gözlemek üçin OpenSearch.
  • Möhüm ýol: awtorizasiýa ≤ 800 ms p95; UI üçin okamagyň yzygiderliligi - eventual (2-3 s çenli).

KYC

Write: status başlamak/täzelenmek üçin toparlar; PII-ni goralýan DB-de saklamak.
Read: PII-siz statuslaryň ýeňil proýeksiýasy; PII zerur bolanda nokat bilen çekilýär.
Howpsuzlyk: status okamak we resminamalara girmek üçin dürli skopes.

Balanslar (iGaming/Maliýe)

Write: atom inkrementleri/dekrementleri bolan 'UserBalance' agregaty; amal üçin idempotent açarlary.
Read: "Çalt balans" üçin keş; ýazmak üçin - write-den göni okamak (berk utgaşdyrmak).
Saga: goýumlar/netijeler wakalar bilen utgaşdyrylýar, şowsuzlyklar ýüze çykan halatynda - öwezini dolmak.


Giriş barlagy

  • Write modeliniň agregatlary we alternatiwalary saýlandy.
  • Esasy kweries kesgitlenildi we olar üçin proýeksiýalar döredildi.
  • Outbox/CDC we idempotent proýeksiýa prosessorlary sazlandy.
  • Proýeksiýalary gaýtadan ýygnamak meýilnamasy bar (snapshot/replay).
  • SLO: toparlaryň gizlinligi, proýeksiýalaryň yza galmagy, aýratynlykda read/write elýeterliligi.
  • Giriş hukuklary bölündi we maglumatlary şifrlemek amala aşyryldy.
  • DLQ/lag/duplikasiýa şowsuzlyklary.
  • Synaglar: şertnamalar, proýeksiýalar, bulam-bujarlyk, gürlemek.

FAQ

CQRS üçin Event Sourcing hökmanymy?
Ýok. Adaty DB + outbox/CDC-de gurup bolýar.

Rasinhronizasiýa garşy nähili göreşmeli?
UX-ni aç-açan dizaýn etmek, proýeksiýalaryň yzyny ölçemek, write-den okamak üçin möhüm amallary bermek.

Write we okamak bir hyzmatda saklanyp bilnermi?
Hawa, fiziki bölünişik - opsiýa; jogapkärçiligi logiki taýdan bölmek hökmanydyr.

Agregatlaryň arasyndaky amallar barada näme?
Saglar we wakalar arkaly; mümkin bolsa paýlanan amallardan gaça duruň.


Jemi

CQRS ellerini açýar: inçe, ygtybarly ýazuw ýoly we materiallaşdyrylan proýeksiýalardan çalt, maksatly okamak. Bu öndürijiligi ýokarlandyrýar, ewolýusiýany ýönekeýleşdirýär we ulgamy ýüklere has çydamly edýär - eger sazlaşyk, gözegçilik we migrasiýa düzgün-nyzam bilen dolandyrylsa.

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.