Подтвердить что ты не робот

CQRS: Хранение событий и их публикация - как это сделать безопасным способом?

Как я узнал в Почему репозиторий CQRS публикует события, а не хранилище событий? это задача репозитория CQRS для публикации событий. Пока что так хорошо.

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

Теперь, к сожалению, многие базы данных NoSQL (такие как MongoDB) не поддерживают транзакции, совместимые с ACID, даже не говоря о возможности прохождения в распределенной транзакции. Более того, есть очереди сообщений, которые также не поддерживают распределенные транзакции.

Итак, вопрос: как мне с этим справиться?

Существует ли рекомендуемый шаблон?

4b9b3361

Ответ 1

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

Как всегда, есть компромиссы. Скорее всего, вам придется иметь дело с обработкой сообщений и идемпотента по крайней мере один раз. Это сложнее, чем использование простой распределенной транзакции.

Джонатан Оливер написал несколько сообщений по этой теме, которые могут вам помочь: Удаление 2PC, Как я избегаю двухфазной фиксации, Шаблоны идемпотентности