Сарчашмаи чорабинӣ: асосҳо
Сарчашмаи чорабинӣ чист
Sourcing Event (ES) як роҳи нигоҳ доштани ҳолати объектҳои домейн на ҳамчун "хати ҷорӣ", балки ҳамчун сабти рӯйдодҳои тағирнопазир, ки ҳама ҳодисаҳоро тасвир мекунад. Ҳолати кунунии агрегат тавассути печонидани (такрори) рӯйдодҳои он ба даст оварда мешавад ва ҳама гуна манзараҳои хониш ҳамчун пешгӯиҳо дар болои ин журнал сохта мешаванд.
Оқибатҳои асосӣ:- Таърих "манбаи ибтидоии ҳақиқат" аст, давлат дурнамои таърих аст.
- Ҳама гуна ҳолатро метавон такрор кард, тафтиш кард ва шарҳ дод (аудит).
- Илова кардани нуқтаи назар ва таҳлилҳои нав муҳоҷирати "лаҳзаҳои кӯҳна" -ро талаб намекунад - аз даст додани рӯйдодҳо кифоя аст.
Истилоҳоти асосӣ
Агрегат - воҳиди домени мутобиқат бо инвариантҳои равшан (Фармоиш, Пардохт, Истифодабаранда).
Ҳодиса - як далели тағйирнопазире, ки дар гузашта рух дода буд ('пардохт. ваколатдор ',' фармоиш. фиристода шудааст ').
Store Store танҳо як замимаи замимаҳоест, ки тартиби рӯйдодҳоро дар дохили воҳид таъмин мекунад.
Нусхаи маҷмӯӣ шумораи рӯйдодҳои охирини татбиқшаванда (барои мувофиқати оптимистӣ) мебошад.
Сурат - таассуроти даврии давлат барои суръат бахшидан ба муттаҳидшавӣ.
Дурнамо (хондан-модел) - назари моддӣ барои хондан/ҷустуҷӯ/гузориш додан (аксар вақт асинхронӣ).
Он чӣ гуна кор мекунад (ришта → рӯйдодҳо → пешгӯиҳо)
1. Муштарӣ фармонеро мефиристад ('Capture
2. Агрегат инвариантҳоро тасдиқ мекунад ва агар ҳамааш хуб бошад, рӯйдодҳоро ба вуҷуд меорад.
3. Чорабиниҳо ба Store Store бо санҷиши версия (мувофиқати оптимистӣ) атомӣ илова карда мешаванд.
4. Протсессори дурнамо ба ҷараёни ҳодиса обуна мешаванд ва моделҳои хонишро нав мекунанд.
5. Вақте ки агрегат барои фармони зерин бор карда мешавад, вазъ пас аз лаҳзаи аксбардорӣ (агар бошад) барқарор карда мешавад.
Тарҳи чорабинӣ
Хусусиятҳои зарурӣ (аслӣ)
json
{
"event_id": "uuid",
"event_type": "payment. authorized. v1",
"aggregate_type": "Payment",
"aggregate_id": "pay_123",
"aggregate_version": 5,
"occurred_at": "2025-10-31T10:42:03Z",
"payload": { "amount": 1000, "currency": "EUR", "method": "card" },
"meta": { "trace_id": "t-abc", "actor": "user_42" }
}
Тавсияҳо:
- Номгузорӣ: 'домен. амал. v {major} '.
- Илова: майдонҳои нав ихтиёрӣ мебошанд, бидуни тағир додани маънои кӯҳнаҳо.
- Минимализм: танҳо далелҳо, бе такрори маълумоти ба осонӣ барқароршаванда.
Шартномаҳо ва нақшаҳо
Схемаҳоро ислоҳ кунед (Avro/JSON Schema/Protobuf) ва мутобиқатро дар CI тафтиш кунед.
Барои тағироти "шикастан" - нусхаи нави асосии ҳодиса ва нашри мувозии 'v1 '/' v2' барои давраи муҳоҷират.
Дастрасии рақобатӣ: мувофиқати оптимистӣ
Қоида: Рӯйдодҳои нав танҳо дар сурате навишта мешаванд, ки 'интизоршаванда _ версия = = current_version'.
Псевдокод:pseudo load: snapshot(state, version), then apply events > version new_events = aggregate. handle(command)
append_to_store(aggregate_id, expected_version=current_version, events=new_events)
//if someone has already written an event between load and append, the operation is rejected -> retray with reload
Ҳамин тавр, мо беайбии инвариантҳоро бидуни муомилоти тақсимшуда кафолат медиҳем.
Суръатҳо (суръатбахшии муттаҳидшавӣ)
Ҳар як ҳодисаи N ё вақтсанҷро сабт кунед.
Храните 'snapshot _ state', 'agregate _ id', 'версия', 'created _ at'.
Ҳамеша пас аз аксбардорӣ рӯйдодҳоро тафтиш кунед ва ба даст оред (на танҳо ба кастинг бовар кунед).
Суратҳоро тоза кунед, то ки онҳо аз журнал барқарор карда шаванд (майдонҳои "ҷодугарӣ" -ро нигоҳ надоред).
Пешгӯиҳо ва CQRS
ES табиатан бо CQRS якҷоя карда мешавад:- Навиштан-модел = агрегатҳо + Store Store.
- Моделҳои = пешгӯиҳоеро, ки бо рӯйдодҳо нав карда шудаанд, хонед (Кортҳои Редис, Ҷустуҷӯи Кушод барои ҷустуҷӯ, Click-House/OLAP барои гузориш додан).
- Пешгӯиҳо номуайянанд: коркарди ҳамон 'event _ id' натиҷаро тағир намедиҳад.
Таҳаввулот ва мутобиқати гардиш
Илова-аввал: илова кардани майдонҳо; намудҳо/семантикаро тағир надиҳед.
Барои тағироти мураккаб, намудҳои нави чорабиниҳоро нашр кунед ва муҳоҷирони пешгӯишавандаро нависед.
Вуруди дукарата ('v1' + 'v2') -ро дар давраи гузариш нигоҳ доред ва вақте ки ҳама пешгӯиҳо омодаанд, 'v1' -ро тирандозӣ кунед.
Бехатарӣ, PII ва "ҳуқуқи фаромӯш шудан"
Таърих аксар вақт маълумоти ҳассосро дар бар мегирад. Равишҳо:- PII-ро дар ҳодисаҳо кам кунед (идентификаторҳо ба ҷои маълумот, тафсилот дар тарафҳои ҳифзшаванда).
- Crypto-тоза кардан: майдонҳои рамзгузорӣ ва ҳангоми нест кардани он калидро нест кунед (ҳодиса боқӣ мемонад, аммо маълумот дастрас нест).
- Воқеаҳои таҷдиди назар: 'корбар. piiredacted. v1 'бо иваз кардани майдонҳои ҳассос дар пешгӯиҳо (таърих далели таҳрирро нигоҳ медорад).
- Сиёсати нигоҳдорӣ: барои баъзе соҳаҳо, баъзе рӯйдодҳоро ба нигаҳдории WORM бойгонӣ кардан мумкин аст.
Иҷро ва миқёс
Тақсимот: фармоиш дар дохили агрегат муҳим аст - қисмбандӣ аз ҷониби 'agregate _ id'.
Оғози хунук: лаҳзаҳо + даврии "фишурда".
Замимаи партия - чорабиниҳои гурӯҳӣ дар як амалиёт.
Backpressure ва DLQ барои протсессори проексия; ақибмондагиро чен кунед (вақт ва шумораи паёмҳо).
Индексатсияи мағозаи чорабиниҳо: дастрасии зуд аз ҷониби '(aggregate_type, aggregate_id)' ва бо мурури замон.
Санҷиш
Санҷишҳои мушаххасот барои агрегатҳо - сенарияи "фармонҳо → рӯйдодҳои пешбинишуда".
Санҷишҳои дурнамо: Ҷараёни ҳодисаро таъом диҳед ва ҳолати/индексатсияро санҷед.
Санҷишҳои такрорӣ: пешгӯиҳоро аз сифр дар мавқеъ барқарор кунед - боварӣ ҳосил кунед, ки натиҷа мувофиқат мекунад.
Бесарусомонӣ/пинҳонӣ: таъхирҳоро ворид кунед ва мегирад, idempotence-ро тафтиш кунед.
Намунаҳои доменҳо
1) Пардохтҳо
Чорабиниҳо: 'пардохт. оғоз ',' пардохт. ваколатдори ',' пардохт. гирифта ',' пардохт. баргардонида шуд '.
Инвариантҳо: шумо бе "ваколатдор" гирифта наметавонед; маблағҳо манфӣ нестанд; асъор бетағйир мондааст.
Дурнамоҳо: "корти пардохтӣ" (КВ), ҷустуҷӯи транзаксия (OpEN Search), гузоришдиҳӣ (OLAP).
2) Фармоишҳо (тиҷорати электронӣ)
Ҳодисаҳо: 'фармоиш. ҷойгир ',' фармоиш. пардохт ',' фармоиш. бастабандишуда ',' фармоиш. интиқол дода шудааст ',' фармоиш. расонида '.
Инвариантҳо: гузариши ҳолати диаграммаи давлатӣ; бекоркунӣ пеш аз 'интиқол' имконпазир аст.
Дурнамо: рӯйхати фармоишҳои корбар, лавҳаҳои SLA аз рӯи ҳолат.
3) Варақаҳои тавозунӣ (Молия/Бозӣ)
Ҳодисаҳо: 'тавозун. амонатгузорӣ ',' тавозун. қарздор ',' тавозун. ба ҳисоб гирифта шудааст ',' тавозун. тасҳеҳ '.
Инварианти сахт: тавозун аз байн намеравад <0; фармонҳо 'operation _ id' мебошанд.
Амалиётҳои интиқодӣ мустақиман аз агрегат (мувофиқати қатъӣ), UI - аз дурнамо (оқибат) хонда мешаванд.
Сохтори маъмулии мағозаи чорабиниҳо (варианти DB)
рӯйдодҳо
'event _ id (PK)', 'agregate _ type', 'agregate _ id', 'version', 'event _ type', 'event _ type', 'meta'
Индекс: '(aggregate_type, aggregate_id, версия)'.
лаҳзаҳо
'aggregate _ type', 'agregate _ id', 'version', 'state', 'created _ at'
Индекс: '(aggregate_type, aggregate_id)'.
consumers_offsets
'consumer _ id', 'event _ id '/' мавқеъ', 'updated _ at' (барои пешгӯиҳо ва чакана).
Саволҳои зуд-зуд пурсидашуда (FAQ-ҳо)
Оё истифодаи ES дар ҳама ҷо ҳатмист?
Не, ин тавр нест. ES муфид аст, вақте ки аудит, инвариантҳои мураккаб, такрористеҳсолкунӣ ва пешниҳоди гуногуни маълумот муҳиманд. Барои CRUD оддӣ, ин зиёдатӣ аст.
Дар бораи дархостҳои "ҳолати кунунӣ" чӣ гуфтан мумкин аст?
Ё аз дурнамо (зуд, оқибат) ё аз агрегат (гаронтар, вале қатъиян) хонед. Амалиётҳои интиқодӣ одатан роҳи дуюмро истифода мебаранд.
Оё ба ман брокери Кафка/ҷараён лозим аст?
Дӯкони ҳодиса - манбаи ҳақиқат; брокер барои паҳн кардани рӯйдодҳо ба проекторҳо ва системаҳои беруна қулай аст.
Бо "ҳаққи фаромӯшӣ" чӣ бояд кард?
PII-ро кам кунед, майдонҳои ҳассосро рамзгузорӣ кунед ва дар пешгӯиҳо тозакунии крипто/сурхкуниро истифода баред.
Чӣ гуна ман маълумоти кӯҳнаро муҳоҷират мекунам?
Скриптро барои тавлиди рӯйдодҳои ретроспективӣ нависед ("дубора баланд") ё аз "ҳолати-тавре" оғоз кунед ва чорабиниҳоро танҳо барои тағиротҳои нав нашр кунед.
Антипаттернҳо
Чорабиниҳо Сарчашма "берун аз одат": системаро бидуни фоидаи домейн мушкил мекунад.
Чорабиниҳои фарбеҳ: бори вазнин бо PII ва дугоникҳо - тормозҳо ва масъалаҳои мувофиқат.
Набудани мувофиқати оптимистӣ: аз даст додани инвариантҳо ҳангоми мусобиқа.
Пешгӯиҳои репродуктивӣ: такрори/лаҳзаҳо → ислоҳи дастӣ нест.
CDC-ҳои хом ҳамчун чорабиниҳои домейн: схемаҳои ихроҷшудаи DB ва пайвасти сахт.
Омезиши чорабиниҳои дохилӣ ва ҳамгироӣ: дар берун "намоиши" мӯътадилро нашр кунед.
Рӯйхати назоратии истеҳсолот
- Агрегатҳо, инвариантҳо ва рӯйдодҳо (унвонҳо, версияҳо, схемаҳо) муайян карда шудаанд.
- Дӯкони чорабиниҳо фармоишро дар доираи мувофиқати умумӣ ва оптимистӣ таъмин мекунад.
- Суратҳо ва нақшаи барқарорсозии онҳо дохил карда шудаанд.
- Пешгӯиҳо номуайянанд, DLQ ва ченакҳои ақибмонда мавҷуданд.
- Схемаҳо дар CI тасдиқ карда мешаванд, сиёсати версия ҳуҷҷатгузорӣ карда мешавад.
- PII кам карда мешавад, майдонҳо рамзгузорӣ карда мешаванд, стратегияи "фаромӯшӣ" мавҷуд аст.
- Такрори дурнамо дар курсии санҷидашуда; нақшаи барқарорсозии офатҳои табиӣ дорад.
- Панели панелҳо: суръати барнома, ақибмонии проексия, хатогиҳои барнома, таносуби бозпурсӣ.
Ҷамъ
Sourcing Sourcing таърихи системаро артефакти дараҷаи аввал месозад: мо далелҳоро ба даст меорем, давлатро аз онҳо таҷдид мекунем ва ҳама гуна намояндагиҳоро озодона месозем. Ин аудит, муқовимат ба тағирот ва чандирии таҳлилро фароҳам меорад - бо назардошти интизом дар схемаҳо, назорати рақобат ва кори салоҳиятдор бо маълумоти ҳассос.