Event-Driven ядро
Event-Driven өзөгү деген эмне
Event-Driven ядро (EDC) - бул "омуртка" архитектура болуп саналат, анда бизнес-фактылар өзгөрүлбөс окуялар катары катталат жана таркатылат, ал эми калган функционалдуулук (окуу, интеграция, аналитика, кэш, нотификация) бул окуялардын агымынын үстүнө курулат. Ядро алсыз байланыштуулукту жана масштабдуулукту камсыз кылуу менен иш-чаралардын келишимин, жеткирүү эрежелерин жана тартиптин/демпотенттиктин инварианттарын белгилейт.
Негизги идея: адегенде фактыны (өзөгүн) жазып, андан кийин аны өз алдынча байытып, керектүү моделдерге чагылдыруу. Бул байланышты азайтат жана жарым-жартылай бузулууларга туруктуулукту жогорулатат.
EDC максаттары жана касиеттери
Фактылардын чындыгы: ар бир окуя - "эмне болду" деген өзгөрүлбөс жазуу.
Начар байланыш: өндүрүүчүлөр керектөөчүлөрдү билишпейт; системаны кеңейтүү - абоненттерди кошуу.
Масштабдоо: партиялардын/топиктердин горизонталдуу өсүшү, көз карандысыз керектөөчүлөр.
Байкоо жана аудит: толук идентификаторлор, кайталануучулук, ретенция жана кайра ойноо.
Башкарылуучу эволюция: схемалардын версиялары, шайкештиги, deprecation.
Архитектуралык компоненттери
1. Шина/брокер окуялар: Kafka/NATS/Pulsar/SNS + SQS - каналдар, партиялар, retenties.
2. схемалар реестри: JSON схемасы/Euro/Protobuf шайкештик жана эволюция үчүн.
3. Outbox/CDC-контур: атомдук чындыкты бекитүү + "кош жазуу" жок жарыялоо.
4. Проекциялар/окуулар (CQRS): тез суроо-талап үчүн материалдык түшүнүктөр.
5. Сагалар/оркестр: окуялар/командалар аркылуу узак мөөнөттүү процесстерди координациялоо.
6. Байытуу: жеке топиктер '.enriched '/' .derived' критикалык жолго таасир этпестен.
7. обсервация: трассировка, логика, окуялар жана лагдар боюнча метрика.
Окуялардын модели
Окуялардын түрлөрү
Domain Events: бизнес-фактылар ('payment. authorized`, `kyc. approved`).
Integration Events: тышкы системаларга багытталган (туруктуу, жай өзгөрөт).
Change Data Capture (CDC): жазуунун техникалык өзгөрүүлөрү (миграция/интеграция үчүн колдонуңуз).
Audit/Telemetry: актёрлордун иш-аракеттери, коопсуздук, SLA.
Милдеттүү атрибуттар (негизги)
json
{
"event_id": "uuid",
"event_type": "payment. authorized. v1",
"occurred_at": "2025-10-31T11:34:52Z",
"producer": "payments-service",
"subject": { "type": "payment", "id": "pay_123" },
"payload": { "amount": 1000, "currency": "EUR", "method": "card" },
"schema_version": 1,
"trace_id": "abc123",
"partition_key": "pay_123"
}
Сунуштар: 'event _ id' глобалдык уникалдуу, 'partition _ key' маңызы үчүн тартипти белгилейт, 'trace _ id' корреляцияны камсыз кылат.
Жеткирүү семантикасы жана ыктымалдуулук
At-least-once (көптөгөн брокерлер үчүн демейки): керектөөчүлөр демпотенттик болушу керек.
At-most-once: экинчи даражадагы телеметриялар үчүн гана алгылыктуу.
Exactly-once: транзакциялар/демпотенттик ачкычтар/лейктер аркылуу агым жана сактоо деңгээлинде жетишилет (кымбатыраак, жакшы себеп керек).
Керектөөчүнүн жол-жобосу
'event _ id '/' (event_id, consumer_id)' менен TTL ≥ Топиктин ретенциясы боюнча дедуп-стол.
Upsert ордуна insert; 'sequence '/' occurred _ at' боюнча проекцияларды версиялоо.
Транзакциянын алкагындагы операциялар: "көргөн" белгиси + абалдын өзгөрүшү.
Тартиби жана партиялаштыруу
Партиянын чегинде кепилденген тартип.
'partition _ key' дегенди бир эле агрегат-маңыздагы окуялардын баары бир партияга кириши үчүн тандаңыз ('user _ id', 'payment _ id').
"Ысык ачкычтар" качуу: жүктү бөлүштүрүү үчүн зарыл болсо, туз/ачкычтар менен хеш.
Схемалар жана эволюция
Additive-биринчи: жаңы кошумча талаалар, негизги нускасы жок түрүн/семантика өзгөртүү тыюу салуу.
Шайкештик: BACKWARD/FORWARD схемалар реестринде; CI шайкеш келбеген өзгөрүүлөргө бөгөт коёт.
Аталышы: 'домен. action. v{major}` (`payment. authorized. v1`).
Миграциялар: "v1" жана "v2" жуптарын параллелдүү жарыялоо, кош нурланууну камсыз кылуу (outbox аркылуу dual-write), өткөндөн кийин "v1" тасмасын тартуу.
Outbox и CDC
Outbox (транзакциялык кызматтар үчүн сунушталат)
1. Бир DD-бүтүм: outbox домендик жазууну жана окуяны сактоо.
2. Фон publisher outbox окуйт, брокерге жарыялайт, "жөнөтүлгөн" деп белгилейт.
3. Кепилдиктер: жыгылганда "жоготуу" фактысы жок, синхрондоштуруу жок.
CDC (Change Data Capture)
Учурдагы системалар/миграция үчүн ылайыктуу; булак - БД репликациясынын лог.
Домендик окуяларга чыпкалоону/коддоону талап кылат ("чийки" таблицаларды сырттан өткөрбөө).
CQRS жана проекциялар
Командалар абалын өзгөртөт (көбүнчө синхрондуу), окуялар - проекцияларды түзөт (асинхрондук).
Проекциялар суроо-талаптарга (издөө, тизмелер, отчеттор) эсептелген, абоненттер тарабынан жаңыланат.
Убактылуу синхрондоштуруу - норма: туруктуу UX көрсөтүңүз ("маалыматтар бир нече секунддан кийин жаңыланат").
Сагалар: процесстерди координациялоо
Оркестр: бир координатору командаларды жиберип, иш-чараларды күтүп.
Хореография: катышуучулар бири-биринин окуяларына жооп беришет (жөнөкөй, бирок келишимдерде тартипти талап кылат).
Эрежелер: так компенсация жана тайм-ауттор, кайталануучу кадамдар, демпотенттик иштеп чыгуучулар.
Байкоо
Trace/Span: 'trace _ id '/' span _ id' окуяларды жаратууда аталыштар аркылуу ыргытыңыз.
Метрика: керектөөчүлөрдүн артта, жарыялоо/керектөө ылдамдыгы, dead-letter rate, дедупликация үлүшү.
DLQ/паркинг лот: ийгиликсиз билдирүүлөр - алерт менен өзүнчө топик; кайра иштетүүнү камсыз кылсын.
Коопсуздук жана шайкештик
Берилиштердин классификациясы: ядро PII/findana (тескери пирамиданын модели) талап кылынган минимумду гана камтыйт, деталдар - байытууда.
Критикалык атрибуттардын кол тамгасы/хэши, бүтүндүктү көзөмөлдөө.
In-flight жана at-rest шифрлөө, темалар/консультанттар боюнча укуктарды секциялоо (IAM/ACL).
Ретенция саясаты жана унутуу укугу: ар бир топик үчүн так аныкталган.
Аткаруу жана туруктуулук
Backpressure: керектөөчүлөрдө - атаандаштыкка чектөө, брокерде - квота/лимиттер.
Batch иштетүү жана кысуу: кошумча чыгымдарды азайтуу үчүн жазууларды топтоо.
тынымсыз аракеттердин ордуна Jitter жана DLQ менен Retray.
Rebalance-туруктуулук: Offset транзакциялык/тышкы сактоо, snapshot менен муздак баштоо тездетүү.
Типтүү окуя үлгүлөрү
Төлөмдөрдүн өзөгү
`payment. initiated. v1` → `payment. authorized. v1` → `payment. captured. v1` → `payment. settled. v1`
Мүчүлүштүктөр: 'payment. declined. v1`, `payment. refunded. v1`
Партиялаштыруу: 'payment _ id'
SLA: ядро лаг ≤ 2c p95; керектөөчүлөрдүн демпотенттүүлүгү милдеттүү.
КУС/текшерүү
`kyc. started. v1` → `kyc. document. received. v1` → `kyc. approved. v1`/`kyc. rejected. v1`
PII - минималдуу; документтин чоо-жайы - 'kyc. enriched. v1 'мүмкүнчүлүгү чектелген.
Аудит/коопсуздук
`audit. recorded. v1 '' actor ',' subject ',' action ',' occurred _ at ',' trace _ id 'атрибуттары менен.
Үзгүлтүксүз Retention/архивдөө; жогорку бүтүндүгү (WORM-сактоо).
Антипаттерндер
Fat Event: ашыкча payloads кереги жок, PII агып.
Иш-чаралар аркылуу Hidden RPC: "Бул жерде жана азыр" синхрондуу жоопторду күтүү.
Чийки CDC сыртка: DD схемасы менен тыгыз байланыш.
Керектөөчүлөрдүн демпотенттиги жок: дубль кош терс таасирлерге алып келет.
Бир жалпы топик "баарына": кызыкчылыктардын кагылышуусу, көйгөйлүү тартип, татаал эволюция.
Этап-этабы менен EDC киргизүү
1. Domain Card: негизги агрегаттарды жана жашоо циклдерин бөлүп.
2. Окуялардын каталогу: аталыштар, маанилер, инварианттар, милдеттүү талаалар.
3. Схемалар жана реестр: форматын тандаңыз, шайкештик эрежелерин киргизиңиз.
4. Outbox/CDC: ар бир продюсер үчүн фактыларды жарыялоо механизмин аныктаңыз.
5. Партиялаштыруу: ачкычтарды тандап, ысык ачкычтарды/кайра бөлүштүрүүнү баалоо.
6. Идемпотенттүүлүк: дедуп үлгүсү + керектөөчүлөрдүн транзакциясы.
7. Проекциялар: материалдаштырылган моделдерди жана SLA жаңыртууларды аныктоо.
8. Observability: Tracking, лагдар, DLQ, Алерт.
9. Security/PII: маалыматтарды классификациялоо, шифрлөө, ACL.
10. Эволюция боюнча гид: версиялар саясаты, депрекейт, миграция үчүн эки тараптуу.
Өндүрүштүн чек-тизмеси
- Ар бир окуяда 'event _ id', 'trace _ id', 'occurred _ at', 'partition _ key' бар.
- Реестрдеги схемалар, шайкештикти текшерүү кирет.
- Керектөөчүлөрдүн аныктыгы ишке ашырылган жана сыналган.
- DLQ/паркинг лот жана жарыялоо/керектөө каталар үчүн Алерт орнотулган.
- Проекциялар логдон (replay) алгылыктуу убакыт менен кайра жүктөлөт.
- PII жетүү чектелген; ядросундагы минималдуу төлөмдөр.
- SLA лагдар/жеткирүү өлчөө жана дашборддордо көрүнүп турат.
- Депрекейт окуялардын жана терезелердин котормолорун көчүрүү планы бар.
FAQ
EDC "жөн эле дөңгөлөк" айырмаланат?
Ядро - бул брокер гана эмес, ошондой эле иш-чаралардын келишими, тартип/демпотенттик эрежелери, эволюция процесстери жана байкоо жүргүзүү.
CDC гана куруу мүмкүнбү?
CDC интеграциялоо/миграция үчүн ылайыктуу, бирок домендик окуялар маанисин ачык-айкын жана туруктуураак DD өзгөрүүлөрүн башынан өткөрөт.
макулдашуу жөнүндө эмне айтууга болот?
Биз eventual consistency кабыл алуу жана UX/жараяндарды ага ылайык долбоорлоо (тактоо көрсөткүчтөрү, retry, ордун толтуруу).
Качан exactly-once керек?
Сейрек: эки эсе катуу жол берилбейт жана ордун толтуруу мүмкүн эмес. Көбүнчө жетиштүү ат-least-once + idempotentity.
Жыйынтык
Event-Driven ядро ишенимдүү система пайдубалына бизнес-фактылардын агымын айландырат. Так иш-чаралар келишимдер, жеткирүү тартиби жана байкоо масштабдуулугун берет, туруктуулук жана эволюциянын ылдамдыгы - өзгөрүүлөр менен алсыз синхрондуу байланыштар жана "бороон" регрессия жок.