Event — tizimda sodir bo‘lgan, boshqa komponentlar uchun ahamiyatli faktni ifodalovchi o‘zgarmas xabar. Masalan, OrderCreated, PaymentConfirmed yoki UserEmailChanged nomlari o‘tgan zamondagi hodisani bildiradi. Event commanddan farq qiladi: command biror amal bajarishni so‘raydi, event esa allaqachon yuz bergan holatni e’lon qiladi. Event-driven arxitekturada producer va consumerlar message broker yoki log orqali bog‘lanadi.
Event tarkibi
Yaxshi event faqat nom emas, identifikatsiya va kontekstga ega:
- event ID — deduplication va trace uchun noyob qiymat;
- type va schema version;
- occurred time — hodisa manbada yuz bergan vaqt;
- producer yoki source;
- aggregate/entity ID;
- payload;
- correlation va causation ID.
Event ID random UUID yoki boshqa global noyob format bo‘lishi mumkin. Timestamp orderingning mutlaq kafolati emas, chunki server soatlari farq qiladi. Entity ichidagi sequence yoki broker partition offset tartibni aniqroq ko‘rsatadi.
Notification va event-carried state
Event notification faqat “order o‘zgardi” va IDni beradi; consumer qo‘shimcha ma’lumot uchun source APIga murojaat qiladi. Bu payloadni kichik saqlaydi, ammo source availability va N+1 so‘rov muammosini keltiradi. Event-carried state transfer kerakli snapshot yoki o‘zgargan maydonlarni olib yuradi, consumer mustaqil read model yaratadi.
Payloadga barcha database row va maxfiy maydonni qo‘shish data leakage va schema couplingni oshiradi. Consumerga zarur, semantik jihatdan barqaror maydonlar tanlanadi. Sensitive data encryption, topic ACL va retention bilan himoyalanadi.
Schema evolution
Producer va consumer bir vaqtda deploy qilinmasligi mumkin. Backward-compatible o‘zgarishda optional field qo‘shiladi, eski consumer uni e’tiborsiz qoldiradi. Maydonni rename yoki type’ni o‘zgartirish breaking change bo‘lishi mumkin. Yangi event type yoki version parallel chiqarilib, consumerlar bosqichma-bosqich o‘tadi.
Schema registry Avro, Protobuf yoki JSON Schema compatibilityni tekshiradi. Semantik o‘zgarish syntax bilan ko‘rinmasligi mumkin: amount avval cents, keyin unit bo‘lsa type o‘sha integer, ma’no buzilgan. Unit, currency va timezone nomda yoki alohida maydonda aniq bo‘ladi.
Yetkazish va idempotency
At-least-once broker duplicate event yetkazishi mumkin. Consumer event ID yoki biznes idempotency key bilan oldin ishlanganini tekshiradi. Database update va dedupe yozuvi bitta transactionda bo‘lmasa, crash orasida side effect qayta bajarilishi mumkin. Inbox pattern message qabulini lokal transactionga bog‘laydi.
Producer database commit qilib, event publishdan oldin crash qilsa fakt tashqariga chiqmaydi. Transactional outbox biznes yozuvi va outbox eventni bitta database transactionda saqlaydi; alohida relay keyin brokerga yuboradi. Relay duplicate publish qilishi mumkin, consumer idempotency baribir kerak.
Ordering va late event
Bir entity eventlari bir partition key bilan tartiblanishi mumkin. Turli partition yoki xizmatlar orasida global tartib yo‘q. Consumer OrderCancelledni OrderCreateddan oldin olsa, buffer, sequence check yoki source’dan snapshot olish siyosatini qo‘llaydi. Cheksiz kutish mumkin emas; watermark va timeout late eventni boshqaradi.
Event time analytics window uchun, processing time tizim ko‘rgan vaqt uchun ishlatiladi. Replay eski eventlarni bugun qayta yuboradi; consumer “hozir sodir bo‘ldi” deb notification jo‘natmasligi uchun replay context yoki idempotent read modelga ega bo‘ladi.
Audit va event sourcing
Audit event kim nima qilgani haqida dalil, integration event boshqa bounded context bilan aloqa, domain event esa model ichidagi biznes faktidir. Bir xil xabar barcha maqsadni qamrab olishi shart emas. Audit log access va retention talabi integration topicdan farq qiladi.
Event sourcingda joriy holat eventlar ketma-ketligidan qayta quriladi. Bu oddiy “event publish qilamiz”dan kengroq model. Eventlar o‘zgarmas, correction yangi compensating event bilan yoziladi. Snapshot replayni tezlashtiradi, ammo event log source of truth bo‘lib qoladi.
Bog‘liq tushunchalar
Event-driven architecture, Message broker, Command, Transactional outbox, Idempotency, Event sourcing, Schema evolution