Domain events

Тема дорожной карты · Software Architecture

Domain Events представляют собой значимые события, произошедшие в бизнес-домене. Они могут включать в себя такие события, как 'OrderPlaced', 'PaymentFailed', или 'UserBanned'. Важно именовать эти события в прошедшем времени, чтобы они точно описывали исторические события, а не будущие намерения. Domain events являются ключевым элементом для обеспечения декомпозиции и асинхронной коммуникации между различными контекстами системы и являются естественной единицей хранения в модели event sourcing.

Как это работает

Когда происходит значимое изменение состояния в бизнес-домене, соответствующая бизнес-логика эмитирует Domain Event. Например, метод Order.place() может эмитировать событие OrderPlaced, а метод Payment.charge() может эмитировать события PaymentFailed или PaymentSucceeded. Эти события содержат только те данные, которые необходимы подписчикам для реакции, обычно это ID объекта и изменённые значения, а не вся сущность целиком. Подписчики в других bounded contexts (или даже в том же контексте) реагируют на эти события асинхронно. Современные messaging-брокеры, такие как Kafka и NATS, обычно используются в качестве транспорта для передачи этих событий.

Когда применять

Domain Events следует использовать, когда нескольким частям системы требуется реагировать на одно и то же бизнес-событие. Это особенно полезно при использовании модели event sourcing, где события становятся источником истины о состоянии системы. Кроме того, Domain Events позволяют декуплировать производителей (producers) от потребителей (consumers) через bounded contexts, что улучшает гибкость и масштабируемость системы. Однако, следует избегать использования Domain Events для чисто внутренних изменений состояния, на которые никто не реагирует, так как это может привести к неоправданным затратам на обработку данных.

Типичные ошибки

  1. Нарушение прошедшего времени — Именование событий в настоящем времени, например, 'PlaceOrder', вместо 'OrderPlaced'. Это может привести к путанице между командами и событиями.
  2. Событие со всеми данными сущности — Использование событий для передачи всей информации о сущности, что может привести к увеличению размера данных и усложнению обработки.
  3. Domain events как message-bus glue — Использование событий для синхронной request-response семантики, где прямые API-вызовы часто являются более простым и эффективным решением.

Связанные понятия

Полезные ресурсы