GH GambleHub

Read Models we proýeksiýalar

Read Model - belli bir önüm ssenarisine laýyklykda çalt okamak üçin ýörite döredilen tablisa/indeks/görnüş. Proýeksiýa - wakalary/çeşmäniň üýtgemelerini Read Model täzelenmesine (adatça idempotent upsert) öwürýän proses. CQRS bilen bilelikde, bu OLTP ýadrosyny düşürmäge we "täzelige" gözegçilik etmek arkaly p95/p99 okamagy durnuklaşdyrmaga mümkinçilik berýär.

Esasy pikirler:
  • "Ähliumumy shema" däl-de, haýyşy bozmak.
  • Täzelemek inkremental we idempotent.
  • Staleness we tertip-düzgüni aç-açan dolandyrmak.

1) Haçan ulanmaly Read Models (we haçan - ýok)

Laýyk:
  • Täzelenmegiň gijikdirilmegi bilen ýygy-ýygydan agyr okalýar (joins/agregasiýa/sortlama).
  • Daşbordlar, kataloglar, lendingler, "top-N", şahsy peýdalar, gözleg sanawlary.
  • Ýüküň bölünişi: write-ýadro - berk, read-tekizligi - çalt we masştably.
Laýyk däl:
  • "Her ýazgy üçin" berk üýtgeşmeleri talap edýän amallar (pul, özboluşlylyk). Ol ýerde - strong path.

2) Binagärlik kontury (söz shemasy)

1. Üýtgeşmeleriň çeşmesi: ALTP-den domen wakalary (event sourcing) ýa-da CDC.
2. Proýeksiýa konweýeri: parser → aggregasiýa/denormalizasiýa → idempotent upsert.
3. Read Store: Soraga optimizirlenen BD/indeks (RDBMS, sütünli, gözleg motorlary).
4. API/Müşderi: Çalt SELECT/GET, "as_of/freshness" atributlary bilen.

3) Taslama Read Model

Soragdan başlaň: haýsy meýdanlar, süzgüçler, sortlar, paginasiýa, top-N?
Denormallaşdyryň: eýýäm birleşdirilen maglumatlary (atlary, pullary, statuslary) saklaň.

Açarlar:
  • Partiýa ýerleşişi: 'tenant _ id', senesi, sebiti boýunça.
  • Primary key: biznes açary + wagtlaýyn baket (mysal üçin '(tenant_id, entity_id)' ýa-da '(tenant_id, bucket_minute)').
  • Indeksler: ýygy-ýygydan where/order by.
  • TTL/retenshn: wagtlaýyn penjireler üçin (mysal üçin, 90 gün).

4) Täzelenmeleriň akymy we idempotentlik

Idempotent upsert - proýeksiýalaryň durnuklylygynyň esasyny düzýär.

Psevdo:
sql
-- Projection table
CREATE TABLE read_orders (
tenant_id  TEXT,
order_id  UUID,
status   TEXT,
total    NUMERIC(12,2),
customer  JSONB,
updated_at TIMESTAMP,
PRIMARY KEY (tenant_id, order_id)
);

-- Idempotent update by event
INSERT INTO read_orders(tenant_id, order_id, status, total, customer, updated_at)
VALUES (:tenant,:id,:status,:total,:customer,:ts)
ON CONFLICT (tenant_id, order_id) DO UPDATE
SET status = EXCLUDED. status,
total = EXCLUDED. total,
customer = COALESCE(EXCLUDED. customer, read_orders. customer),
updated_at = GREATEST(EXCLUDED. updated_at, read_orders. updated_at);
Düzgünler:
  • Her habar wersiýany/wagty göterýär; diňe "täze ýa-da deň" (idempotency) kabul edýäris.
  • Agregatlar üçin (hasaplaýjylar, pullar) - state saklaň we kommutatiw täzelenmeleri (ýa-da CRDT çemeleşmeleri) ulanyň.

5) Üýtgeşmeleriň çeşmesi: wakalar vs CDC

Wakalar (event sourcing): baý semantika, dürli proýeksiýalary gurmak aňsat; shemalaryň ewolýusiýasy möhümdir.
CDC (logiki köpeltmek): diňe bar bolan DB birikdirmek; DML → wakalar we ses täzelenmeleri süzülmeli.

Iki wariant:
  • "Zäherli" habarlar üçin gowşuryş kepillikleri (at-least-once) we DLQ.
  • Açar tertibi (partition key = 'tenant _ id: entity _ id').

6) Tertip, sebäplilik we "täzelik"

Açar boýunça tertip: bir obýektiň wakalary yzygiderli gelmeli; partiýa ýerleşişini we wersiýalaryny ulanyň.
Sebäpler (session/causal): awtoryň öz üýtgemelerini (RYW) görmegi üçin, soraglarda watermark wersiýasyny beriň.
Täzelik (bounded staleness): 'as _ of '/' X-Data-Freshness' -i yzyna gaýtaryň we SLO-ny saklaň (mysal üçin, p95 ≤ 60 c).

7) Inkremental agregatlar we top-N

Minutlyk satuw baketleriniň mysaly:
sql
CREATE TABLE read_sales_minute (
tenant_id TEXT,
bucket  TIMESTAMP, -- toStartOfMinute revenue  NUMERIC(14,2),
orders  INT,
PRIMARY KEY (tenant_id, bucket)
);

-- Update by Event
INSERT INTO read_sales_minute(tenant_id, bucket, revenue, orders)
VALUES (:tenant,:bucket,:amount, 1)
ON CONFLICT (tenant_id, bucket) DO UPDATE
SET revenue = read_sales_minute. revenue + EXCLUDED. revenue,
orders = read_sales_minute. orders + 1;
Top-N üçin:
  • "Revenue DESC" üçin tertipli penjiräni saklaň we diňe üýtgän ýerleriňizi (heap/skiplist/limited table) täzeläň.
  • Topuň "penjiresini" saklaň (mysal üçin, segment üçin 100-1000 setirler).

8) Gözleg we geo-proýeksiýalar

Gözleg (ES/Opensearch): denormallaşdyrylan resminama, pipeline transformasiýalary, resminamanyň wersiýasy = çeşmäniň wersiýasy.
Geo: 'POINT/LAT, LON' saklaň, taýlary/kwadrotrileri öňünden jemläň.

9) Köp tenant we sebitler

'tenant _ id' proýeksiýa açarlarynda we wakalarda hökmanydyr.
Fairness: "şowhunly" beýlekileri haýallatmaz ýaly, per tenant (WFQ/DRR) proýeksiýalaryny çäklendiriň.
Residency: proýeksiýa write-ýadro bilen bir sebitde ýaşaýar; sebitara penjireler - agregatlar/hasabatlar.

10) Synlamak we SLO

Metrikler:
  • 'projection _ lag _ ms' (çeşme → vitrin), 'freshness _ age _ ms' (soňky deltadan bäri).
  • täzelenmeler, ýalňyşlyklaryň paýy, DLQ-rate, redrive-success.
  • Penjireleriň ululygy, p95/p99 okamagyň gizlinligi.
Söwda/giriş:
  • Теги: `tenant_id`, `entity_id`, `event_id`, `version`, `projection_name`, `attempt`.
  • Düşündirişler: merge-çözgütler, köne wersiýalary sypdyrmak.

11) Oýun kitaplary (runbooks)

1. Lagyň ösüşi: konnektory/brokeri barlamak, partiýany köpeltmek, esasy penjireleriň ileri tutulmagyny öz içine almak.
2. Shemanyň köp ýalňyşlygy: täzeden ýazmagy doňdurmak, shemalary göçürmek (backfill), mapperiň täze wersiýasy bilen täzeden başlamak.
3. Gaýtalanýan DLQ: batch azaltmak, "kölegeli" işläp taýýarlaýjyny açmak, duýgurlygy güýçlendirmek.
4. Penjiräniň gapma-garşylygy: magazineurnaldan/çeşmeden penjireleri penjireden geçirmek (tenant/partition boýunça saýlamak).
5. Gyzgyn açarlar: açar boýunça bäsdeşligi çäklendirmek, ýerli nobatlary goşmak, agregaty aýratyn penjirä çykarmak.

12) Doly hasaplamak (rebuild) we backfill

Çemeleşme:
  • Sarp etmegi duruzmak (ýa-da penjiräniň täze görnüşine geçmek).
  • Paketler bilen sanamak (partiýa/sene/tenant boýunça).
  • Iki fazaly switçini açyň: ilki 'read __ v2' -ni dolduryň, soňra okamagyň ugrukdyrylyşyny atomiki geçiriň.

13) Shemalaryň ewolýusiýasy (wersiýalaşdyrmak)

'schema _ version' wakalarda/resminamalarda.
Proýeksiýa birnäçe wersiýany okap bilýär.
Uly üýtgeşmeler üçin - täze v2 penjiresi we kanar traffigi.

14) Howpsuzlyk we elýeterlilik

Çeşmeden RLS/ACL miras; penjiräni başlangyç maglumatlardan has giň etmäň.
PII-ni UX/analitika üçin zerur bolmadyk proýeksiýalarda gizläň.
Redaktirlemeleriň/gaýtadan hasaplamalaryň/el bilen düzedişleriň barlagy.

15) Konfigurasiýa şablony

yaml projections:
read_orders:
source: kafka. orders. events partition_key: "{tenant_id}:{order_id}"
idempotency: version_ts upsert:
table: read_orders conflict_keys: [tenant_id, order_id]
freshness_slo_ms: 60000 dlq:
topic: orders. events. dlq redrive:
batch: 500 rate_limit_per_sec: 50 read_sales_minute:
source: cdc. orders partition_key: "{tenant_id}:{bucket_minute}"
aggregate: increment retention_days: 90 limits:
per_tenant_parallelism: 4 per_key_serial: true observability:
metrics: [projection_lag_ms, dlq_rate, redrive_success, read_p95_ms]

16) Adaty ýalňyşlyklar

"Ähli ýagdaýlar üçin bir vitrin" → agyr täzelenmeler we erbet p99.
Hereketsizligiň ýoklugy → goşa/agregatlarda bökmek.
Dual-write göni penjirede we OLTP → tapawutlar.
Täzelik görünmeýär → önüm bilen garaşmak gapma-garşylygy.
Rebuild iki fazaly switçsiz → jogaplarda "deşikler".
Partiýa/indeks ýok → gymmaty we gizlinligi ýokarlandyrmak.

17) Çalt reseptler

Katalog/gözleg: dokumental vitrin + inkremental upsert, lag ≤ 5-15 c, süzgüçler üçin indeksler.
Daşbordlar: minut/sagat baketleri, agregatlar 'SUM/COUNT', p95 täzelik ≤ 60 s.
Şahsy lenta: awtor üçin ulanyjy + causal/RYW proýeksiýasy, keş üçin fallback.
Global SaaS: sebitleýin penjireler, kross-sebitleýin agregatlar; fairness per tenant.

18) Azyk önüminden öň çek-sanawy

  • Vitrin anyk haýyşnama boýunça düzüldi; indeksler we partiýalar bar.
  • Üýtgeşmeleriň çeşmesi saýlandy (wakalar/CDC); eltip bermegiň kepillikleri we açar boýunça tertibi.
  • Wersiýalary/wagty bilen idempotent upsert; "köne" wakalardan goramak.
  • Täzelik SLO kesgitlenildi we jogaplarda berilýär ('as _ of/freshness').
  • DLQ we ygtybarly redaktirleme sazlandy; rebuild/backfill.
  • Bäsdeşlik çäklendirmeleri (per-key serial) we fairness per tenant.
  • Lagyň/ýalňyşlyklaryň/latency metrikleri, p95/p99 üçin aladalar we DLQ beýikligi.
  • Shemalary wersiýalaşdyrmak we migrasiýa strategiýasy (v2 + switch).
  • Giriş/PII syýasaty miras alyndy we barlandy.

Netije

Read Models we proýeksiýalar okamagyň in engineeringenerçilik tizlendirijisidir: öňünden aýdyp boljak millisekundlary almak we ýazgylaryň özenini düşürmek üçin "täzelik" we akym infrastrukturasy üçin az bahadan töleýärsiňiz. Penjireleriňizi islege görä dizaýn ediň, täzelenmeleri duýgur ediň, gijikdirmegi ölçäň we täzeligi aýdyň wada beriň - we API-leriňiz ýük, maglumatlar we geografiýa köpelse-de çalt dowam eder.

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.