1

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

У меня есть проблема: как вы откатываете операцию в случае ошибки?

Например:

Скажем, у меня есть приложение, которое имеет порядок, чтобы сохранить порядок в базу данных, а также сохранить копию приказа в формате PDF на CMS. Приложение запускает событие, созданное новым заказом, и служба pdf, которая подписывается на это событие, сохраняет PDF-файл. Между тем при совершении изменения заказа в базу данных генерируется исключение. Проблема в том, что pdf был сохранен, но их не соответствует записи базы данных.

Должен ли я кэшировать ранее обработанные события и запускать новое событие ошибки, которое обращается к кешу для операций «отменить»? Используйте что-то вроде шаблона команды для этого?

Или ... это агрегатор событий, который не является хорошим примером для этого.

Редактировать

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

Моя первоначальная мысль заключалась в ограничении зависимостей с использованием шаблона агрегатора событий.

+0

Помните, что вы также можете использовать события в памяти; искать Уди Дахан Домен События Спасение. – JefClaes

ответ

2

Вы хотите, чтобы событие было зафиксировано в той же транзакции, что и операция в вашей базе данных.

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

Возможно, вы можете получить больше вдохновения в одном из моих предыдущих сообщений на eventual consistent domain events with RavenDB and IronMQ.

2

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

+0

Я вижу смысл хранить PDF в базе данных, но вторая точка с событием обгонов после создания записи вызывает ту же проблему, если создание PDF не удается. – Chris

+0

@Chris 2pc-commit, если вам нужно хранить базу данных и cms атомарно, но я вполне сомневаюсь в необходимости. – Hippoom

+0

@Chris Это не та же проблема. Ошибка при создании PDF-файла является ошибкой, но создание PDF-кода для несуществующего порядка создает несогласованность. Обработчики событий могут выйти из строя - исправить проблему и обработать событие еще раз. –

Смежные вопросы