Что произойдет, если DomainEventPublisher.publish() завершится успешно, но транзакция завершится неудачно?
В данном случае я против подхода Вернона. Я предпочитаю возвращать события в сервис приложений. Таким образом, я могу сохранить изменения, выполненные агрегатом, с помощью транзакции (если это необходимо) и, если все в порядке, я опубликую событие. Это также помогает поддерживать чистоту и чистоту бизнес-уровня.
В нескольких словах; если транзакция терпит неудачу, то событие не возникает.
Что произойдет, если произойдет сбой DomainEventPublisher.publish()?
Событие предметной области по бизнес-правилам никогда не завершается неудачей, потому что это уведомление о том, что произошло. Если агрегат сказал «Да» операции и возвращает событие, выражающее бизнес-изменения; тогда ничто в мире не должно говорить, что эта операция не может быть сделана или должна быть отменена.
Если событие вызывает сбой из-за инфраструктуры, вам необходимо иметь инструменты для его повторного вызова (автоматически или вручную), когда сбой будет устранен, и в конечном итоге заархивировать согласованность в вашей системе. Взгляните на NServiceBus. Он предоставляет повторные попытки, очереди ошибок, журналы и т. д., чтобы никогда не терять события. Если система сообщений не работает, у вас есть по крайней мере журналы событий, которые вы можете использовать, чтобы повторно поднять их в систему сообщений.
person
jlvaquero
schedule
21.11.2018
What happens if the subscriber experiences concurrency contention with another client, causing its modification to fail? The modification can be retried if the subscriber does not acknowledge success to the messaging mechanism. The message will be redelivered, a new transaction started, a new attempt made to execute the necessary command, and a corresponding commit. This retry process can continue until consistency is achieved, or until a retry limit is...
- person Constantin Galbenu   schedule 21.11.2018DomainEventPublisher
с привязкой к потоку, вы в значительной степени получаете тот же точный результат с той же возможностью тестирования. Шаблон действительно использует транзакции базы данных, но домен никак не знает об этом. Я не очень понимаю вашу точку зрения. - person plalx   schedule 21.11.2018IO
вызов, и мне это не нравится. Я держу свои Агрегаты в чистоте, без побочных эффектов, фактически без зависимости от Инфраструктуры или каких-либо других Компонентов. - person Constantin Galbenu   schedule 21.11.2018DomainEventPublisher
- person Constantin Galbenu   schedule 21.11.2018DomainEventPublisher
— это компонент домена, который находится в домене и выполняет публикацию событий в памяти без каких-либо операций ввода-вывода. Вам может не нравиться идея статического класса, но, в конце концов, он не добавляет никаких ограничений или практических недостатков по сравнению с возвратом событий или их записью в коллекцию на AR. Единственная проблема, которую я вижу, заключается в том, что если вDomainEventPublisher
есть ошибка, то тесты могут завершиться неудачей, но я не вижу в этом проблемы, учитывая, что это не тот компонент, который все равно когда-либо изменится. - person plalx   schedule 21.11.2018DomainEventPublisher
— это инфраструктура, которая находится в домене. Агрегаты не должны зависеть от инфраструктуры. Саги или модели чтения могут зависеть от инфраструктуры, потому что им это необходимо, а агрегаты — нет (потому что есть другие способы сделать это). Это мое личное мнение. - person Constantin Galbenu   schedule 21.11.2018DomainEventPublisher
, они будут зависеть от надежной инфраструктуры обмена сообщениями, которая отличается отDomainEventPublisher
. Это просто реализация публикации-подписки в памяти, которая имеет интерфейс, управляемый UL, вспомогательный класс. Я думаю, вы могли бы концептуально рассматривать это как инфраструктуру, но это просто разделение волос, учитывая, что на самом деле это не оказывает никакого негативного влияния на гибкость модели и системы (по крайней мере, не то, о чем я могу думать прямо сейчас). Это не похоже на то, если бы AR зависел от NServiceBus. - person plalx   schedule 21.11.2018DomainEventPublisher.publish()
? - person Constantin Galbenu   schedule 21.11.2018DomainEventPublisher
, то он публикует события в списке подписчиков в памяти. Вы можете посмотреть пример реализации здесь. - person plalx   schedule 21.11.2018