Обработка ошибок диспетчера CQRS EventStore - PullRequest
4 голосов
/ 11 апреля 2011

Я смотрел на 2 сценария: А в порядке, Б не уверен.

Сценарий A: Имитация перезапуска приложения после коммита до отправки

  1. Запустить EventStore
  2. Подтвердить изменение
  3. Событие не отправлено
  4. Stop Event store
  5. Запустить хранилище событий

Событие De commited отправляется снова на шаге 5. Это отлично работает, и я вижу это также в коде диспетчера.

Сценарий B: Имитация ошибки шины

  1. Запустить EventStore
  2. Подтвердить изменение 1
  3. Исключение в диспетчере
  4. Подтвердить изменение 2
  5. Отправка в порядке

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

Есть триггер, который будет пытаться отправить сообщение, или мне нужно написать код, чтобы справиться с этим, или мои рассуждения ошибочны?

1 Ответ

7 голосов
/ 11 апреля 2011

Ваша оценка сценария A верна в случае сбоя, такого как перезапуск приложения или машина / завершение процесса, когда процесс запускается снова, он обнаруживает неотправленные коммиты и отправляет их диспетчеру.

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

Вопрос, который у вас действительно возникает, заключается в том, как следует обрабатывать сбои шины и, соответственно, сбои очереди? EventStore имеет интерфейс IPublishCommits. Когда событие зафиксировано, оно отправляется диспетчеру. Диспетчеры просто несут ответственность за маркировку события как отправленного, как только оно было правильно и успешно обработано реализацией IPublishCommits.

Наилучший способ обработки переходных сбоев шины и очереди заключается в реализации шаблона прерывателя цепи в вашей реализации IPublishCommits, который повторяется до тех пор, пока все не начнет работать снова. Для более серьезных проблем, таких как сбои сериализации, вы можете записать какой-то критический сбой, который немедленно уведомит администратора. Опять же, проблема во всем этом заключается в том, что EventStore не может знать обо всех особенностях вашей ситуации.

...