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