İki tür event
Sistemde iki farklı event türü vardır ve bunlar bilinçli olarak ayrı tutulur:| Domain Event | Integration Event | |
|---|---|---|
| Kapsam | Aynı process (in-memory) | Process/servis-arası |
| Transport | MediatR Publish | IEventBus → RabbitMQ |
| Zamanlama | SaveChanges ile aynı transaction mantığında, commit sonrası dispatch | Outbox ile aynı transaction’a yazılır, commit sonrası asenkron yayınlanır |
| Base | DomainEvent (SharedKernel) — INotification | IntegrationEvent — INotification |
| Örnek | UserOtpGeneratedDomainEvent, FaqCreatedDomainEvent | UserCreatedIntegrationEvent, CacheInvalidationIntegrationEvent |
Tam akış
Akış adım adım
- Command handler aggregate metodunu çağırır; aggregate
AddDomainEvent(...)ile event biriktirir. UnitOfWork.SaveEntitiesAsync→base.SaveChangesAsync(audit + soft-delete interceptor burada devrede).result > 0ise dispatch tetiklenir.MediatorExtension.DispatchDomainEventsAsyncchange-tracker’daki aggregate’lerin event’lerini toplar, temizler ve tek tek dispatch eder.- Event
IBusEvent’ten türüyorsa (yaniIntegrationEventise) →IEventBus.PublishAsync→ Outbox tablosuna aynı DbContext transaction’ında yazılır; aksi haldemediator.Publishile in-processINotificationHandler’lara gider. - Outbox’taki satırı
OutboxDeliveryServicearka planda RabbitMQ’ya publish eder.
Kural: Domain event commit’le birlikte aynı mantıksal işlemde dispatch edilir; integration event commit sonrası asenkron yayınlanır. Integration event’i Outbox’a yazmak, “DB commit oldu ama mesaj yayınlanamadı” (dual-write) riskini ortadan kaldırır — ayrıntı: Outbox Pattern.
Hangisini ne zaman kullanmalı?
- Domain event — aynı process içinde yan etki: OTP SMS/e-posta gönder, cache tag düşür, admin bildirimi üret.
- Integration event — başka bir servisin (veya gelecekte ayrışacak bir bounded context’in) tüketeceği olay: welcome akışı, cross-service cache L1 senkron.
Bu bölümde
Domain Events
DomainEvent base, AddDomainEvent, INotificationHandler.Integration Events
IntegrationEvent, IBusEvent, consumer kaydı.Outbox Pattern
Transactional outbox, dual-write çözümü.
RabbitMQ Topology
Exchange, routing key, retry, DLX.