Доменный дизайн и доменные события - PullRequest
7 голосов
/ 08 июня 2011

Я новичок в DDD и сейчас читаю статьи, чтобы получить больше информации. Одна из статей посвящена событиям домена (DE). Например, отправка электронной почты - это событие домена, возникающее после выполнения некоторых критериев при выполнении фрагмента кода.

Пример кода показывает один способ обработки событий домена и сопровождается этим параграфом

Обратите внимание, что приведенный выше код будет выполняться в том же потоке в той же транзакции, что и обычная работа с доменом, поэтому вам следует избегать любых действий по блокировке, таких как использование SMTP или веб-сервисов. Вместо этого предпочитайте использовать одностороннюю передачу сообщений, чтобы общаться с кем-то еще, что выполняет эти блокирующие действия.

Мои вопросы

  1. Это общая проблема при работе с DE? Или это просто забота о решении в упомянутой статье?
  2. Если доменные события возникают в транзакции, и система не будет обрабатывать их синхронно, как они должны обрабатываться?
  3. Когда я решу сериализовать эти события и позволить планировщику (или любому другому механизму) выполнить их, что произойдет, когда транзакция откатится? (в статье событие вызывается в коде, выполняемом в транзакции), кто отменит их (если они не сохранены в базе данных)?

Спасибо

1 Ответ

8 голосов
/ 08 июня 2011

Это общий период проблем, не говоря уже о DDD

В общем, в любой системе, которая должна отвечать быстрым ответом (например, веб-сервер, любые длительные операции должны обрабатываться асинхронно с процессом запуска).

Это означает очередь.

Откат вашей транзакции должен удалить элемент из очереди.

Конечно, теперь вам нужны дополнительные механизмы для обработки ситуации, когда элемент наочередь не может быть обработана - то есть электронное письмо не отправлено - вы также должны учесть это в своем коде запуска - наличие последующего процесса RELY для более раннего процесса, который уже произошел, может вызвать проблемы в некоторый момент.

Короче говоря, ваш механизм очередей должен сам по себе быть транзакционным и обеспечивать повторные попытки, и вам нужно рассматривать всю цепочку событий как рабочий процесс.

...