Ваша оценка сценария A верна в случае сбоя, такого как перезапуск приложения или машина / завершение процесса, когда процесс запускается снова, он обнаруживает неотправленные коммиты и отправляет их диспетчеру.
Сценарий B несколько сложнее. Проблема в том, что EventStore не является шиной, поэтому вопрос о том, как обрабатывать ошибки в шине, не может быть обработан в самом EventStore. Кроме того, поскольку существует множество реализаций шины, я не хочу связывать EventStore с какой-либо конкретной реализацией. Некоторые пользователи могут даже не использовать шину сообщений; вместо этого они могут решить использовать вызовы RPC.
Вопрос, который у вас действительно возникает, заключается в том, как следует обрабатывать сбои шины и, соответственно, сбои очереди? EventStore имеет интерфейс IPublishCommits. Когда событие зафиксировано, оно отправляется диспетчеру. Диспетчеры просто несут ответственность за маркировку события как отправленного, как только оно было правильно и успешно обработано реализацией IPublishCommits.
Наилучший способ обработки переходных сбоев шины и очереди заключается в реализации шаблона прерывателя цепи в вашей реализации IPublishCommits, который повторяется до тех пор, пока все не начнет работать снова. Для более серьезных проблем, таких как сбои сериализации, вы можете записать какой-то критический сбой, который немедленно уведомит администратора. Опять же, проблема во всем этом заключается в том, что EventStore не может знать обо всех особенностях вашей ситуации.