GH GambleHub

CQRS-ը և կարդալու/գրելու բաժանումը

Ի՞ նչ է CQRS

CQRS (Command Query Responsibility Segregation) ճարտարապետական մոտեցում է, որը կիսում է տվյալների մոդելը և բաղադրիչները, որոնք պատասխանատու են ձայնագրման (commands) և կարդալու համար (queries)։

Գաղափարը 'վիճակը փոխելու գործընթացը օպտիմիզացվում է վալիդային ինվարանտների և գործարքների տակ, իսկ ընթերցումը' արագ, արագ նախագծման և մեծացման համար։

💡 Թիմերը փոխում են վիճակը և վերադարձնում վիրահատության արդյունքը։ Հարցումները միայն կարդում են և չունեն կողմնակի ազդեցություն։

Ինչու՞ է դա անհրաժեշտ

Ընթերցանության արտադրողականությունը 'նյութականացված պրոյեկտներ կոնկրետ սցենարների համար (ժապավեններ, հաշվետվություններ, զեկույցներ և)։

Կրիտիկական ճանապարհի իրականացումը 'ձայնագրությունը մեկուսացված է «ծանր» ջոիններից և ագրեգատներից։

Պահեստների ընտրության ազատությունը 'OLTP-ը գրելու համար, OLAP/kash/որոնման շարժիչները կարդալու համար։

Արագացված էվոլյուցիա 'ավելացրեք նոր գաղափարներ առանց ռիսկի «կոտրելու» գործարքի։

Դիտարկումը և աուդիտը (հատկապես Event Sourcing), ավելի հեշտ է վերականգնել և վերարտադրել վիճակը։


Երբ կիրառեք (և երբ ոչ)

Հարմար է, եթե

Տարբեր տվյալների և բարդ ագրեգացիայի հետ ընթերցումները գերակշռում են։

Ձայնագրման կրիտիկական ճանապարհը պետք է լինի բարակ և կանխատեսելի։

Անհրաժեշտ են տարբեր SLO/SLA կարդալու և գրելու համար։

Պահանջվում է ձայնագրման հիբրիդային տրամաբանության մեկուսացում վերլուծական/որոնողական կարիքներից։

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

Դոմենը պարզ է, ոչ մի բան։ CRUD-ն հաղթահարում է։

Ընթերցանության և գրելու միջև ամուր ներդաշնակությունը պարտադիր է բոլոր չափանիշների համար։

Թիմը անփոփոխ է, իսկ վիրահատական բարդությունը անընդունելի է։


Հիմնական հասկացություններ

Թիմը (Command) 'մտադրությունը փոխել վիճակը («Cream Order», «Captics Paype»)։ Ստուգում է ինվարանտները։

Հարցումը (Query) 'տվյալներ ստանալը («GetOrance ByID», «ListUserTransactions»)։ Առանց կողմնակի ազդեցությունների։

Ձայնագրման մոդել 'ագրություններ/ինվարանտներ/գործարքներ; պահպանումը ռելյացիոն/բանալին արժեք/իրադարձական լոգ է։

Կարդալու մոդելը (պրոյեկտներ) 'նյութականացված սեղաններ/ինդեքսներ/քեշ, համաժամեցված ասինխրոնո։

Համաձայնություն 'հաճախ eventium-ը գրելու և կարդալու միջև։ կրիտիկական ճանապարհները ուղիղ կարդալով write մոդելից։


Ճարտարապետություն (կմախք)

1. Write ծառայությունը 'ընդունում է թիմերը, առաջնորդում ինվարանտները, նկարագրում է փոփոխությունները (BD կամ իրադարձություններ)։

2. Windobox/CDC-ը 'փոփոխությունների փաստի երաշխավորված հրատարակումը։

3. Պրոյեկտների իրականացումը 'լսում են իրադարձությունները/CDC և նորարարում են read մոդելները։

4. Read-ծառայություն 'ծառայում է queries նյութականացված գաղափարներից/keshey/որոնումից։

5. Սագին/նվագախումբը 'լուծարում են քրոս-ագրեգատ գործընթացները։

6. Դիտարկումը 'պրոյեկցիաների լագը, հաջողակ օգտագործման տոկոսը, DLQ-ը։


Ձայնագրման մոդելի նախագծումը

Ագրեգատները ՝ գործարքների հստակ սահմանները (օրինակ ՝ «Order», «Payment», «UserBal.ru»)։

Invariants: Ձևավորել (գումարներ 240, եզակի, լիմիտներ)։

Թիմերը idempotenty բանալին են (օրինակ ՝ «idempotency _ key»)։

Գործարքները նվազագույն են։ արտաքին կողմնակի էֆեկտները 'www.box-ի միջոցով։

Թիմի օրինակը (կեղծ-JSON)

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

Կարդալու մոդելի նախագծումը

Հարցրու. Ի՞ նչ էկրաններ/հաշվետվություններ են անհրաժեշտ։

Դենորմալիզացիան թույլատրելի է 'read-մոդելը' «օպտիմիզացված քեշը»։

Մի քանի պրոյեկցիաներ տարբեր առաջադրանքների համար 'որոնում (OpenSearch), հաշվետվություններ (սյունակային պահեստ), քարտեր (KV/Redis)։

TTL-ը և փոխպատվաստումը. Պրոյեկտները պետք է կարողանան վերականգնվել աղբյուրից (իրադարձությունների/սարքավորումների հոսքը)։


Համաձայնություն և UX

Eventium consistency: ինտերֆեյսը կարող է հակիրճ ցույց տալ հին տվյալները։

UX-pattern: «տվյալները նորարարվում են»..., optimistic UI, համաժամացման լուծիչներ, վտանգավոր գործողությունների արգելափակում մինչև հաստատումը։

Վիրահատությունների համար, որոնք պահանջում են ուժեղ միացում (օրինակ, ճշգրիտ հավասարակշռության ցուցադրումը նախքան դուրս գրելը), կատարվում է անմիջապես write մոդելից։


CQRS և Event Sourcing (ցանկությամբ)

Event Sourcing-ը (ES) պահպանում է իրադարձությունները, իսկ ագրեգատի վիճակը նրանց փաթեթավորման արդյունք է։

CQRS + ES-ի կապը տալիս է կատարյալ աուդիտ և թեթև պրոյեկտների փոխանակում, բայց բարձրացնում է բարդությունը։

Այլընտրանքը 'սովորական OLTP-BD + www.box/CDC project։


Կրկնօրինակումը 'Disbox և CDC

Medibox (մեկ գործարքում) 'էքսպորտային փոփոխությունների ձայնագրությունը + www.box-ում իրադարձությունների ձայնագրությունը։ pabliker տեղափոխում է անվադողեր։

CDC 'BD (Debez.ru և այլն) լոգոն համարելը վերափոխում է հիբրիդային իրադարձությունների։

Երաշխիքներ 'լռելյայն at-leport-once, սպառողները և պրոյեկտները պետք է լինեն idempotents։


Պահեստների ընտրություն

Write: (PostgreSQL/MySQL) գործարքների համար։ KV/Document - որտեղ ինվարանտները պարզ են։

Read:
  • KV/Redis - քարտեր և արագ հիմնական ընթերցումներ։
  • Որոնում (OpenSearch/Elasticsearch) - որոնում/ֆիլտրեր/ֆասետներ;
  • Ուղեկցող (ClickHouse/BigQuery) - հաշվետվություններ;
  • Քեշը CDN-ում հանրային կոմպոզիցիաներ և/բովանդակություն է։

Patterns 2019

API շերտ 'առանձին էնդպոինտա/ծառայություններ «commands» և «queries» համար։

Idempotention 'գործողության բանալին գլխում/մարմնում։ recent-keys պահպանումը TTL-ից։

Սագին/նվագախումբը 'թայմ-աուտներ, փոխհատուցում, քայլերի կրկնություն։

Backpressure 'պրոյեկտների պրոցեսորների զուգահեռ սահմանափակումը։


Դիտարկումը

Write: p95/99 թիմերի լատինականությունը, հաջողակ գործարքների մասը, վալիդացիայի սխալները։

Read: p95/99 հարցումներ, hit-rate կեշա, որոնք տեղադրված են որոնման կլաստերի վրա։

Պրոյեկցիաների լագը (ժամանակը և հաղորդագրությունները), DLQ տոկոսադրույքը, դեդուպլիկացիաների տոկոսը։

Թրեյսինգը ՝ «trace _ id», անցնում է www.dw.box-ի թիմի միջոցով, որը կանխատեսում է www.query։


Անվտանգություն և ընկերակցություն

Իրավունքների բաժանումը 'տարբեր scopes/դերեր գրելու և կարդալու համար։ ամենափոքր արտոնությունների սկզբունքը։

PII/PCI 'նվազեցրեք նախագծերում։ կոդավորումը at-rest/in-flight; դիմակավորում։

Աուդիտ 'գրանցեք թիմը, դերասան, արդյունքը, «trace _ id»; WORM արխիվները կրիտիկական օրինագծերի համար (վճարումներ, KYC)։


Փորձարկումներ

Delract tes.ru 'թիմերի համար (սխալներ, ինվարանտներ) և queries (108/ֆիլտրեր)։

Project tes.ru: Մի շարք իրադարձություններ/CDC-ներ և վերջնական read-մոդելը։

Chaos/latency: Ուշացումների ներարկումը ռուսական պրոյեկտներում; UX-ի ստուգումը ճամբարում։

Replayability: Պրոյեկցիաների փոխպատվաստումը պատի վրա։


Մոսկվան և էվոլյուցիան

Նոր դաշտերը ադիդիտիվ են իրադարձության մեջ/CDC; read մոդելները փոխակերպվում են։

Կրկնակի ձայնագրությունը (dult-write) սխեմաների ռեդիզինի ժամանակ։ հին պրոյեկցիաները պահում ենք մինչև։

Տարբերակումը '«v1 »/« v2» իրադարձություններ և endpoints, Sunset պլանը։

Feature flags-ը 'նոր queries/prosports-ի ներդրումն է։


Antipatterns

CQRS-ը «նորաձևության համար» պարզ CRUD ծառայություններում։

Կարդալու խիստ սինխրոն կախվածությունը գրությունից (սպանում է մեկուսացումը և կայունությունը)։

Մեկ ինդեքսը ամեն ինչի համար 'տարբեր հարցումների խառնուրդ մեկ read-store-ում։

Ոչ մի գաղափար չկա, որ պրոյեկտները ունեն կրկնապատկումներ և տարբերություններ։

Չկարգավորված պրոյեկտներ (ոչ repley/supshots)։


Օրինակներ օրինակներ

Վճարումներ (առցանց ծառայություն)

Write: «Authorize», «Capture», «Refund» գործարքային BD-ում։ Box-ը հրապարակում է «pay.ru.»։

Read:
  • Redis «մրցույթի քարտը» UI-ի համար;
  • ClickHouse-ի համար;
  • OpenSearch-ը գործարքներ գտնելու համար։
  • Կրիտիկական ճանապարհը 'հեղինակային իրավունքը 800 ms p95; UI-ի համար կարդալու համակարգումը eventronics է (մինչև 2-3 s)։

KYC

Write: հրամաններ սկսելու/ապդեյթ կարգավիճակի վրա։ PII պահպանումը պաշտպանված BD-ում։

Read: հեշտացված կարգավիճակի պրոյեկցիա առանց PII; PII-ը ճշգրտորեն ձգվում է, անհրաժեշտության դեպքում։

Անվտանգությունը 'տարբեր scopes' կարգավիճակը կարդալու և փաստաթղթերի հասանելիության համար։

Հավասարակշռություններ (iGaming/ֆինանսներ)

Write: UserBalms-ի ագրեգատը ատոմային պարամետրերով/դեկրեմենտներով։ իդեմենտալ բանալիներ վիրահատության համար։

Read: kash «արագ հավասարակշռության» համար; դուրս գրելու համար ուղղակի ընթերցում է write (խիստ համաձայնություն)։

Սագա 'դեպոզիտները/եզրակացությունները կարգավորվում են իրադարձություններով, ձախողումների դեպքում' փոխհատուցում։


Ներդրման չեկի ցուցակ

  • Առանձնացված են write մոդելի ագրեգատները և ինվարանտները։
  • Որոշված են հիմնական queries և նախագծված են դրանց տակ։
  • Տրամադրված են www.box/CDC և impotent պրոյեկտների համակարգերը։
  • Կա պրոյեկտների փոխպատվաստման պլան (wwww.apshot/replay)։
  • SLO 'թիմերի լատենտ, պրոյեկցիաների լագը, read/write հասանելիությունը առանձին։
  • Տվյալների հասանելիության և կոդավորման իրավունքները բաժանված են։
  • Alerty-ը DLQ/lag/dedupliation-ում։
  • Թեստեր ՝ պայմանագրեր, պրոյեկցիաներ, քաոս, ռեփլեյ։

FAQ

Արդյո՞ ք Event Sourcing-ը CQRS-ի համար։

Ոչ։ Դուք կարող եք կառուցել սովորական BD + www.box/CDC-ի վրա։

Ինչպե՞ ս կարող ենք պայքարել ռասինխրոնիզացիայի դեմ։

Հստակ նախագծել UX-ը, չափել պրոյեկտների լամպը, տալ կրիտիկական պարամետրեր կարդալ write-ից։

Հնարավո՞ ր է, որ մեկ ծառայությունում պահես ինչպես write, այնպես էլ read։

Այո, ֆիզիկական բաժանումը օբյեկտիվ է։ պատասխանատվության տրամաբանական բաժանումը պարտադիր է։

Ի՞ նչ կարելի է ասել ագրեգատների միջև գործարքների մասին։

Սագայի և իրադարձությունների միջոցով։ խուսափեք բաշխված գործարքներից, եթե կարող եք։


Արդյունքը

CQRS-ը փակցնում է ձեռքերը 'նուրբ, հուսալի ձայնագրման ճանապարհը հստակ ինվարիաներով և արագ, նյութականացված պրոյեկցիաներից կարդալու համար։ Սա բարձրացնում է արտադրողականությունը, պարզեցնում է էվոլյուցիան և համակարգը ավելի դիմացկուն է դարձնում բեռներին, եթե կարգապահորեն կառավարենք համաձայնությունը, դիտարկումը և կարգավորումը։

Contact

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

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

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

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

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

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