Ҷудошавии CQRS ва хондан/навиштан
CQRS чист
CQRS (Сегрегатсияи Масъулияти Фармондеҳӣ) равиши меъморӣ мебошад, ки модели маълумот ва ҷузъҳои масъули навиштан (фармонҳо) ва хондан (дархостҳо) -ро ҷудо мекунад.
Идея: Раванди тағйири давлат барои инвариантҳо ва муомилоти дуруст ва хониш барои пешгӯиҳои зуд, мақсаднок ва миқёс оптимизатсия карда шудааст.
калид> Фармонҳо ҳолати худро тағир медиҳанд ва натиҷаи амалиётро бармегардонанд. Дархостҳо танҳо хонда мешаванд ва ягон таъсири манфӣ надоранд.
Чаро ба шумо лозим аст
Иҷрои хондан: пешгӯиҳои сенарияҳои мушаххас (наворҳо, гузоришҳо, каталогҳо).
Устувории роҳи интиқодӣ: сабти ҷудо аз "вазнин" ва агрегатҳо.
Озодии интихоби анбор: OLTP барои навиштан, OLAP/кэш/системаҳои ҷустуҷӯ барои хондан.
Таҳаввулоти босуръат: Бе хатари "шикастани" транзаксияҳо назари нав илова кунед.
Мушоҳида ва аудит (хусусан дар якҷоягӣ бо Event Sourcing): барқарор кардан ва такрори давлат осонтар аст.
Кай бояд муроҷиат кард (ва вақте ки не)
Мувофиқ аст, агар:- Хонишҳо бо иловаро маълумоти гуногун ва маҷмӯи мураккаб бартарӣ доранд.
- Роҳи сабти интиқодӣ бояд нозук ва пешгӯишаванда бошад.
- Барои хондан ва навиштан SLO/SLA-ҳои гуногун лозиманд.
- Ҷудокунии мантиқи навиштани домейн аз эҳтиёҷоти таҳлилӣ/ҷустуҷӯ талаб карда мешавад.
- Домен оддӣ аст, сарборӣ кам аст; CRUD мубориза мебарад.
- Мувофиқати қавӣ байни хондан ва навиштан барои ҳама сенарияҳо ҳатмист.
- Гурӯҳ бетаҷриба аст ва мураккабии амалиётӣ қобили қабул нест.
Мафҳумҳои асосӣ
Фармон-нияти тағир додани вазъро дорад ('Эҷод кардан', 'CapturE Pay'). Инварианҳоро тафтиш мекунад.
Маълумотҳои Query-Retrives ('Get Таъсири иловагӣ нест.
Модели сабт: агрегатҳо/инвариантҳо/транзаксияҳо; нигаҳдорӣ - сабти relational/key-value/воқеа.
Модели хондан (дурнамо): ҷадвалҳои моддӣ/индексатсияҳо/кэш, асинхронӣ ҳамоҳанг карда шудаанд.
Мувофиқат: Аксар вақт дар байни сабт ва хониш; роҳҳои интиқодӣ - тавассути мутолиаи мустақим аз модели навиштан.
Меъморӣ (скелет)
1. Хидмати навиштан: фармонҳоро қабул мекунад, ғайриварианҳоро тасдиқ мекунад, тағиротро сабт мекунад (пойгоҳи додаҳо ё рӯйдодҳо).
2. Outbox/CDC: интишори кафолати далели тағирот.
3. Протсессори дурнамо: Чорабиниҳо/CDC-ро гӯш кунед ва моделҳои хонишро нав кунед.
4. Хидмати хондан: дархостҳоро аз нуқтаи назари моддӣ/кэш/ҷустуҷӯ пешниҳод мекунад.
5. Сагас/оркестр: ҳамоҳангсозии равандҳои байнисоҳавӣ.
6. Мушоҳида: ақибмонии дурнамо, фоизи барномаҳои муваффақ, DLQ.
Тарҳрезии модели сабт
Агрегатҳо: Ҳудуди дақиқи муомилот (масалан, 'Фармоиш', 'Пардохт', 'Истифодабаранда').
Инвариантҳо: ба расмият даровардан (миқдори пулӣ ≥ 0, беҳамтоӣ, маҳдудиятҳо).
Фармонҳо аз рӯи калид idempotent мебошанд (масалан, 'idempotency _ key').
Амалиётҳо дар миқёс ҳадди аққал мебошанд; таъсири беруна - тавассути outbox.
Намунаи фармон (Pseudo-JSON)
json
{
"command": "CapturePayment",
"payment_id": "pay_123",
"amount": 1000,
"currency": "EUR",
"idempotency_key": "k-789",
"trace_id": "t-abc"
}
Тарҳрезии модели хониш
Аз саволҳо сар кунед: кадом экранҳо/гузоришҳо лозиманд?
Denormalization қобили қабул аст: хондан-модел - "кэши оптимизатсияшуда".
Якчанд пешгӯиҳо барои вазифаҳои гуногун: ҷустуҷӯ (OpEN Search), ҳисоботҳо (нигаҳдории сутун), кортҳо (KV/Redis).
TTL ва дубора насб кардан: пешгӯиҳо бояд аз манбаъ барқарор шаванд (такрори ҳодисаҳо/лаҳзаҳо).
Мувофиқат ва UX
Мувофиқати ниҳоӣ: интерфейс метавонад маълумоти кӯҳнаро дар муддати кӯтоҳ нишон диҳад.
Намунаҳои UX: "маълумот нав карда мешавад"..., UI оптимистӣ, нишондиҳандаҳои синхронизатсия, амалҳои хатарнокро то тасдиқи он манъ мекунанд.
Барои амалиёте, ки мувофиқати сахтро талаб мекунад (масалан, пеш аз сабт кардани тавозуни дақиқ), бевосита аз модели навиштан хонед.
CQRS ва сарчашмаи чорабиниҳо (ихтиёрӣ)
Чорабинӣ Sourcing (ES) чорабиниҳоро нигоҳ медорад ва ҳолати агрегат натиҷаи ҷамъшавии онҳост.
Маҷмӯи CQRS + ES аудити беҳтарин ва азнавбақайдгирии пешгӯиҳоро медиҳад, аммо мураккабиро афзоиш медиҳад.
Алтернатива: пойгоҳи додаҳои муқаррарии OLTP + outbox/CDC → пешгӯиҳо.
Нусхабардорӣ: Outbox ва CDC
Outbox (дар як амалиёт): тағир додани домейн + навиштани ҳодиса ба қуттӣ; ношир ба шина мерасонад.
CDC: хондан аз сабти пойгоҳи додаҳо (Debezium ва ғайра) → табдил ба рӯйдодҳои домейн.
Кафолатҳо: бо нобаёнӣ ҳадди аққал як маротиба, истеъмолкунандагон ва пешгӯиҳо бояд бемаънӣ бошанд.
Интихоби анбор
Нависед: relational (Postgre КВ/Ҳуҷҷат - дар ҷое, ки инвариантҳо оддӣ мебошанд.
Хондан:- KV/Redis - кортҳо ва хондани калидҳои зуд;
- Ҷустуҷӯ (Ҷустуҷӯи Open/Elasticsearch) - ҷустуҷӯ/филтрҳо/ҷабҳаҳо;
- Сутун (Click
- Кэш дар CDN - феҳристҳои ҷамъиятӣ/мундариҷа.
Намунаҳои ҳамгироӣ
Қабати API: нуқтаҳои ҷудогона/хидматҳо барои 'фармонҳо' ва 'дархостҳо'.
Идемпотенсия: калиди амалиёт дар сарлавҳа/бадан; нигоҳдории калидҳои охирин бо TTL.
Сагас/оркестр: танаффус, ҷубронпулӣ, такрори қадамҳо.
Backpressure-Параллелизми протсессори лоиҳаро маҳдуд мекунад.
Мушоҳидакорӣ
Андозагирии навиштан: таъхирҳои фармони p95/99, фоизи амалиётҳои муваффақ, хатогиҳои тасдиқкунӣ.
Нишондиҳандаҳои хондан: дархостҳои p95/99, кэши хит-нарх, сарборӣ ба кластери ҷустуҷӯ.
Ақибмонии дурнамо (вақт ва паёмҳо), меъёри DLQ, фоизи такрорӣ.
Пайгирӣ: 'trace _ id' аз фармоиши § outbox → проексияи § дархост мегузарад.
Бехатарӣ ва мувофиқат
Ҷудосозии ҳуқуқҳо: миқёс/нақшҳои гуногун барои навиштан ва хондан; принсипи ҳадди аққал имтиёз.
PII/PCI: ҳадди аққал дар пешгӯиҳо; рамзгузорӣ дар вақти истироҳат/ҳангоми парвоз; ниқоб.
Аудит: Гурӯҳи ислоҳ, актёр, натиҷа, 'trace _ id'; Бойгонии WORM барои соҳаҳои муҳим (пардохтҳо, KYC).
Санҷиш
Санҷишҳои шартномавӣ: барои фармонҳо (хатогиҳо, ғайривариантҳо) ва дархостҳо (форматҳо/филтрҳо).
Санҷишҳои дурнамо: як қатор чорабиниҳо/CDC-ро пешниҳод кунед ва модели хониши ниҳоиро санҷед.
Хаос/таъхир: ворид кардани таъхир ба протсессори проексия; Санҷиши UX дар ақиб.
Бозсозӣ: аз нав насб кардани пешгӯиҳо дар стенд аз лаҳзаҳо/журнал.
Муҳоҷират ва таҳаввулот
Майдонҳои нав - иловагиҳо дар ҳодиса/CDC; моделҳои хондан барқарор карда мешаванд.
Ҳангоми тарҳрезии схемаҳо дубора нависед; пешгӯиҳои кӯҳнаро то гузариш нигоҳ доред.
Версия: 'v1 '/' v2' чорабиниҳо ва нуқтаҳои ниҳоӣ, нақшаи ғуруби офтоб.
Парчамҳои хусусият: ҷорӣ намудани дархостҳо/пешгӯиҳои нав дар канария.
Анти-намунаҳо
CQRS "ба хотири мӯд" дар хидматҳои оддии CRUD.
Вобастагии сахти синхронӣ барои хондан (ҷудоӣ ва суботро мекушад).
Як шохис барои ҳама: омезиши дархостҳои гуногунҷабҳа ба як мағозаи хониш.
Пешгӯиҳо idempotency → нусхабардорӣ ва номутобиқатӣ надоранд.
Пешгӯиҳои барқарорнашаванда (такрори/лаҳзаҳо нест).
Намунаҳои доменҳо
Пардохтҳо (хидмати онлайн)
Нависед: 'Иҷозат диҳед', 'Гирифтан', 'Баргардонидан' дар пойгоҳи додаҳои транзаксионӣ; outbox пардохтро нашр мекунад. '.
Хондан:- Редис "корти пардохт" барои UI;
- Клик барои гузориш додан;
- Ҷустуҷӯ барои ҷустуҷӯи амалиётҳо.
- Роҳи интиқодӣ: иҷозат ≤ 800 ms p95; мутолиа барои UI - оқибат (то 2-3 с).
KYC
Навиштан: фармонҳо барои оғоз/навсозӣ; Нигоҳдории PII дар пойгоҳи додаҳо.
Хонда шуд: дурнамои сабуки статусҳо бидуни PII; Агар лозим бошад, PII нуқтаи қатъиро мустаҳкам мекунад.
Амният: соҳаҳои гуногуни вазъи хониш ва дастрасӣ ба ҳуҷҷатҳо.
Ҳисобҳои мувозинат (IGaming/Finance)
Нависед: Ҷамъбасти 'Истифодабаранда' бо афзоиш/коҳишҳои атомӣ; калидҳои idempotent барои ҷарроҳӣ.
Хонда шуд: кэш барои "тавозуни зуд"; барои аз ҳисоб баровардан - мутолиаи мустақим аз навиштан (мувофиқати қатъӣ).
Saga: пасандозҳо/хулосаҳо бо рӯйдодҳо ҳамоҳанг карда мешаванд, дар ҳолати нокомӣ - ҷуброн.
Рӯйхати санҷиши амалисозӣ
- Агрегатҳо ва инвариантҳои модели навиштан таъкид шудаанд.
- Дархостҳои асосӣ муайян карда шудаанд ва пешгӯиҳо барои онҳо пешбинӣ шудаанд.
- Протсессори проексияи Outbox/CDC ва idempotent танзим карда мешаванд.
- Нақшаи фаврӣ/такрорӣ мавҷуд аст.
- SLO: таъхири фармон, ақибмонии дурнамо, дастрасии хондан/навиштан алоҳида.
- Ҳуқуқҳои ҷудошуда ва рамзгузории маълумот амалӣ карда мешаванд.
- Огоҳии DLQ нокомӣ/ақибмонӣ/такрорӣ.
- Санҷишҳо: Шартномаҳо, пешгӯиҳо, бетартибӣ, такрорӣ.
FAQ
Оё чорабинӣ барои CQRS ҳатмӣ аст?
Не, ин тавр нест. Шумо метавонед дар пойгоҳи додаҳои муқаррарӣ + outbox/CDC созед.
Бо desynchronization чӣ гуна бояд мубориза бурд?
Ба таври возеҳ тарҳрезии UX, ақибмонии дурнаморо чен кунед, бигзор амалиёти интиқодӣ аз навиштан хонда шавад.
Оё дар як хидмат ҳам навиштан ва ҳам хондан мумкин аст?
Бале, ҷудошавии ҷисмонӣ ихтиёрӣ аст; тақсимоти мантиқии масъулиятҳо ҳатмист.
Дар бораи муомилот байни агрегатҳо чӣ гуфтан мумкин аст?
Тавассути sagas ва рӯйдодҳо; Агар имкон бошад, аз муомилоти тақсимшуда худдорӣ намоед.
Натиҷа
CQRS дастҳоро мекушояд: роҳи лоғар ва боэътимоди навиштан бо инвариантҳои равшан ва зуд, аз пешгӯиҳои матлуб хонда мешавад. Ин ҳосилнокиро афзоиш медиҳад, эволютсияро содда мекунад ва системаро ба стресс тобовартар мекунад - агар пайдарҳамӣ, мушоҳида ва муҳоҷират интизом бошанд.