GH GambleHub

Read Models և պրոյեկցիաներ

Read Model-ը հատուկ նախագծված կոդն է/ինդեքսը/տեսակը արագ կարդալու համար հատուկ ապրանքային սցենարի համար։ Պրոյեկցիան մի գործընթաց է, որը վերածում է իրադարձությունների/աղբյուրի փոփոխությունը Read Model-ի թարմացման մեջ (սովորաբար idempotent ups.ru)։ CQRS-ի հետ կապված դա թույլ է տալիս բեռնել OLTP միջուկը և կայունացնել p95/p99 ընթերցումները, վերահսկելով «թարմությունը»։

Հիմնական գաղափարները

Դենորմալիզացնել հարցման տակ, ոչ թե «համընդհանուր սխեմա»։

Թարմացնելը ռեֆմենտալ և իդեմենտալ է։

Հստակ կառավարել staleness և կարգը։

1) Երբ օգտագործեք Read Models (և երբ 'ոչ)

Հարմար է

Հաճախակի ծանր ընթերցումներ (ջոիններ/ագրեգացիաներ/տեսակավորում) նորարարության թույլատրելի ուշացումով։

Dashbords, lendings, «առաջին N», անձնական ֆիդներ, որոնման ցուցակներ։

Բեռի բաժանումը 'write-միջուկը' խիստ, read-ինքնաթիռը 'արագ և մեծացված։

Չի համապատասխանում

Վիրահատությունները, որոնք պահանջում են խիստ ինվարանտներ «յուրաքանչյուր ձայնագրման համար» (գումար, եզակի)։ Այնտեղ 'strong path։

2) Ճարտարապետական ֆորումը (բանավոր սխեմա)

1. Փոփոխությունների աղբյուրը 'տիրույթի իրադարձությունները (event sourcing) կամ CDC-ը OLTP-ից։

2. Պրոյեկտների փոխակրիչը 'պարսեր/denomation/didempotent ups.ru։

3. Read Store: BD/ինդեքսը օպտիմիզացված է հարցման համար (RDBSA, հսկայական, որոնողական)։

4. API/հաճախորդ 'արագ RTS/GET, «as _ of/freshness» օրինակներով։

3) Read Model նախագծումը

Սկսեք հարցումից 'ի՞ նչ դաշտեր, ֆիլտրեր, տեսակավորում, պագինացիա, առաջին N։

Դենորմալիզացրեք 'պահպանեք արդեն միավորված տվյալները (անուններ, գումարներ, արձաններ)։

Բանալիներ

Կուսակցությունը '«tenium _ id», ամսաթիվը, տարածքը։

Primary key: բիզնես բանալին + ժամանակավոր բաքը (օրինակ ՝ «(tenrone _ id, entity _ id)» կամ «(tenrone _ id, bucket _ minae)»)։

Ինդեքսներ ՝ հաճախակի where/order by։

TTL/retenshn 'ռուսական վիտրինի համար (օրինակ, 90 օր)։

4) Հոսքի հոսքը և կուռքերը

Idempotent ups.ru-ը պրոյեկտների կայունության հիմքն է։

Կեղծ

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);

Կանոնները

Յուրաքանչյուր հաղորդագրություն կրում է տարբերակը/ժամանակը։ ընդունում ենք միայն «թարմ կամ հավասար» (idempotency)։

Ագրեգատների համար (հաշվիչներ, գումարներ), պահեք state և օգտագործեք բաղադրիչ նորարարություններ (կամ CRDT մոտեցումներ)։

5) Փոփոխության աղբյուրը 'vs CDC իրադարձությունները

Իրադարձությունները (event sourcing) 'հարուստ սեմանտիկան, հեշտ է կառուցել տարբեր պրոյեկտներ։ սխեմաների էվոլյուցիան կարևոր է։

CDC (տրամաբանական կրկնօրինակումը) 'պարզապես միացնել գոյություն ունեցող BD-ին։ Mapping DML-ը կպահանջի իրադարձությունների և աղմկոտ դեղատների ֆիլտրացման։

Երկու տարբերակները պահանջում են

Առաքման երաշխիքները (at-least-once) և DLQ-ը «թունավոր» հաղորդագրությունների համար։

Կարգի բանալին (partenskey = «tenrone _ id: entity _ id»)։

6) Կարգը, պատճառները և «թարմությունը»

Մեկ օբյեկտի իրադարձությունները պետք է հետևողական լինեն. օգտագործեք նվագակցումը և տարբերակները։

Պատճառները (session/causal), որպեսզի հեղինակը տեսնի իր փոփոխությունները (RYW), փոխանցեք watermark տարբերակը պահանջների մեջ։

Թարմություն (bounded staleness): Վերադարձեք «as _ of »/« X-J-Freshness» և պահեք SLO (օրինակ ՝ p95-60 c)։

7) Ռուսական ագրեգատները և առաջին N-ը

Վաճառքի րոպեանոց տանկերի օրինակ

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;

Առաջին N-ի համար

Աջակցեք վիրավորված վիտրինին (օրինակ ՝ «revenue DESC») և թարմացրեք միայն փոփոխված դիրքերը (heap/skiplist/limited table)։

Պահեք «պատուհանը» (օրինակ ՝ 100-1000 տող սեգմենտում)։

8) Որոնողական և գեո պրոյեկցիաներ

Որոնումը (ES/Oppronearch) 'վերարտադրված փաստաթուղթ, pipeline փոխակերպումներ, փաստաթղթի տարբերակը = աղբյուրի տարբերակը։

Գեյո 'պահեք «POP/LAT, LON», նախկինում համախմբեք թայլերը/քառակուսիները։

9) Multi-tenant և տարածաշրջանները

«tenrone _ id» -ը պարտական է պրոյեկտների և իրադարձությունների բաներին։

Fairness: Սահմանափակեք throughput պրոյեկտները per tenae (WFQ/MSR), որպեսզի «աղմուկը» չխանգարի մյուսներին։

Residency: Պրոյեկտը ապրում է նույն տարածաշրջանում, ինչպես write-միջուկը։ միջտարածաշրջանային վիտրինները ագրեգատներ/ծալքեր են։

10) Դիտարկումը և SLO-ն

Մետրիկները

«project _ lag _ 24» (ռուսական վիտրինի աղբյուրը),« freshness _ age _ 2019 »(վերջին դելտա պահից)։

throughput apdeits, սխալների մասը, DLQ-rate, redrive-success։

Վիտրինի չափը, p95/p99 ընթերցանության լատենտ։

Թրեյսինգ/լոգներ

Теги: `tenant_id`, `entity_id`, `event_id`, `version`, `projection_name`, `attempt`.

Սենսացիաներ ՝ merge լուծումներ, հնացած տարբերակների բաց։

11) Պլեյբուկի (runbooks)

1. Ճամբարի աճը 'ստուգել կոնեկտորը/բրոքերը, ավելացնել կուսակցությունները, ներառել հիմնական վիտրինի գերակայությունը։

2. Սխեմայի շատ սխալներ 'սառեցնել ռեդրեյվը, կատարել սխեմաների միգրացիան (backfill), վերագործարկել մապերի նոր տարբերակով։

3. Կրկնվող DLQ 'նվազեցնել batch-ը, ներառել «ստվերային» վերամշակողը, ուժեղացնել կուռքերը։

4. Վիտրինի անհամապատասխանությունը 'կատարել rebuild վիտրինները/աղբյուրը պատուհանի համար (ընտրովի ten.ru/part.ru)։

5. Տաք բանալիներ 'սահմանափակել մրցակցությունը, ավելացնել տեղական գծերը, միավորել առանձին պատուհանի մեջ։

12) Ամբողջական վերահաշվարկ (rebuild) և backfill

Մոտեցում

Դադարեցնել սպառումը (կամ անցնել վիտրինի նոր տարբերակին)։

Հաշվել փաթեթները (կուսակցության/ամսաթվերի/տենանտների)։

Միացրեք երկբևեռ սվիտչը 'նախ լցրեք «read _ v2», ապա ատոմորեն փոխում ենք ընթերցանության ուղղությունը։

13) Սխեմաների էվոլյուցիան (տարբերակումը)

«schema _ version» իրադարձություններում/փաստաթղթերում։

Պրոյեկցիան կարող է կարդալ մի քանի տարբերակներ, միգրացիա «ամռանը»։

Մեծ փոփոխությունների համար 'նոր v2 վիտրինը և կանարեկային ֆորումը։

14) Անվտանգություն և հասանելիություն

Ժառանգեք RFC/ACL աղբյուրից։ մի արեք վիտրինը ավելի լայն հասանելի, քան սկզբնական տվյալները։

Դիմակավորված PII-ը UX/վերլուծության համար անհրաժեշտ նախագծերում։

Ռեդրեյվների/հատումների/ձեռքով աջ։

15) Միգրացիայի ձևը

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) Տիպիկ սխալներ

«Մեկ վիտրինը բոլոր դեպքերի համար» նկարագրվում է ծանր դեղագործներ և վատ p99։

Idempotenty բացակայությունը կատարվում է դուբլի/ցատկում ագրեգատներում։

Dance-write ուղղակիորեն վիտրինի և OLTP-ի տարբերությունները։

Թարմության զրոյական տեսանելիությունը բացատրում է սննդի հետ սպասումների հակամարտությունը։

Rebuild-ը, առանց երկչափ սվիտչի, պատասխանում է «անցքեր»։

Ոչ մի կուսակցական/ինդեքսներ ապացուցում են արժեքի և լատենտության աճը։

17) Արագ բաղադրատոմսեր

Գրացուցակ/որոնում: Վավերագրական վիտրինը + www.ru իրական ups.ru, lag no 5-15 c, ֆիլտրերի ինդեքսները։

Dashbords: րոպե/ժամ բաքեր, «SUM/COUNT» ագրեգատներ, p95 թարմություն 2460 c։

Անձնական ժապավենը '+ causal/RYW-ի պրոյեկտը հեղինակի համար, fallback-ի վրա։

Գլոբալ SaaS 'տարածաշրջանային վիտրիններ, քրոսեքսային ագրեգատներ։ fairness per tenant.

18) Չեկ թուղթ մինչև վաճառելը

  • Վիտրինը նախագծված է կոնկրետ հարցման համար։ կան ինդեքսներ և կուսակցություններ։
  • Փոփոխությունների աղբյուրը ընտրվել է (իրադարձություններ/CDC); երաշխիքներ և կարգուկանոն բանալիով։
  • Idempotent ups.ru տարբերակներով/ժամանակ; պաշտպանություն «հին» իրադարձություններից։
  • SLO թարմություն է տալիս և պատասխանում է («as _ of/freshness»)։
  • DLQ և անվտանգ ռեդրեյվը տրամադրված են. plack rebuild/backfill։
  • Մրցակցության սահմանափակումները (per-key serial) և fairness per tenae։
  • Լագայի/սխալների/latency, alerts p95/p99 և DLQ աճի վրա։
  • Սխեմաների տարբերակումը և միգրացիայի ռազմավարությունը (v2 + սվիտչ)։
  • Հասանելիության քաղաքականությունը/PII ժառանգվում և ստուգվում են։

Եզրակացություն

Read Models-ը և պրոյեկտները ընթերցանության ինժեներական արագացուցիչն են, դուք վճարում եք «թարմ» և striming ենթակառուցվածքը, որպեսզի ստանաք կանխատեսելի միլիմետրեր և բեռնեք ձայնագրությունների միջուկը։ Նախագծեք վիտրինները հարցման տակ, դարձրեք apdeits idempotent, չափեք լամպը և հստակ խոստացեք թարմություն, և ձեր API-ն կմնա արագ նույնիսկ բեռի, տվյալների և աշխարհագրության աճի ժամանակ։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։