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