Я работаю над системой CQRS + ES, в основном использую инфраструктуру аксонов, но на самом деле этот вопрос относится к любой реализации.Итак, у меня есть обработчик команд и один или несколько обработчиков событий, работающих на разных JVM, контейнерах и т. Д., И в какой-то момент один из этих обработчиков сталкивается с ошибкой.
У нас есть два случая, «ожидаемая» бизнес-ошибкаи «неожиданная» системная ошибка.Насколько я понимаю, мы сейчас находимся в асинхронном обработчике, и событие теперь является фактом, поэтому в действительности мы не можем напрямую откатить команду ни для одного случая (поскольку это может повлечь за собой откат ее в многочисленных других проекциях и прерывание CQRS).
Таким образом, мой вопрос заключается в том, должна ли такая ошибка быть «разрешена» каким-либо образом в бухгалтерской книге, т. Е. Путем отправки новой команды «аннулирования», которая затем передается в прогнозы таким образом, чтобы событиеошибка теперь решена?
В качестве примера, скажем, у нас есть команда, которая обновляет кредит клиента.Событие публикуется, один прогноз обновляет свою статистику «Всего кредитов», другой публикует обновление некоторого веб-сокета для пользовательского интерфейса и, наконец, другой, который поддерживает состояние кредита - и этот последний обработчик завершается ошибкой.Должны ли мы отправить команду на откат бизнес-транзакции и снова вычесть кредит, снова обновить веб-сокет и т. Д.?А в случае аксона есть ли способ, которым это фиксируется как транзакция?