NEventStore: саги, команды и не потерять их

NEventStore: 5.1
Простая настройка: WebApp (Asp.NET 4.5) == командная часть

Я ищу "правильный" способ не потерять команды, с прицелом на саг / менеджеров процессов, которые, возможно, будут бесконечно ждать события, полученного из команды, которая фактически никогда не обрабатывается.

Старый: Диспетчеры

Сначала я использовал команды синхронизации, но, взглянув на sagas / process-manager, я подумал, что было бы безопаснее сначала сохранить их, а затем получить через SyncDispatcher (или AsyncDispatcher). В противном случае, я обеспокоен тем, что если сага попытается отправить команду, а команда не завершится из-за app-crash / powerloss /..., она будет потеряна, и никто не узнает.

Поэтому я создал поток команд и добавил к нему каждую команду. IsDispatched показал, если эта команда уже была обработана.
Это сработало.

PollingClient и Command-Stream

Теперь, когда диспетчеры устарели, я переключился на PollingClient, То, что я потерял, это Dispatched Информация.

Возникла проблема стартапа:
Я наивно начал опрашивать текущую последнюю контрольную точку, но при перезапуске приложения была вероятность того, что команды были сохранены, но не выполнены до сбоя и, следовательно, потерялись (что на самом деле произошло).

Я просто наткнулся на идею:
сохранить основной результат команд как (не доменные) события в другом потоке.
Этот поток будет содержать CommandSucceeded а также CommandFailed События.
Когда приложение запускается, извлекается последний идентификатор команды или номер контрольной точки команды, используемые для загрузки команд сразу после этого...

Вопросы

  • Неужели я обеспокоен тем, что обработка команд синхронизации приводит к опасности потери сгенерированной команды, не так ли? Если да, то почему?
  • Это вообще хорошая идея: один большой поток команд?
  • Как правило, это хорошая идея: хранить общие события команда-результат в потоке?

2 ответа

Вы можете:

  1. Сохранить вашу команду в очереди команд | постоянный журнал
  2. Используйте идентификатор команды (guid) в качестве идентификатора фиксации на NEventStore
  3. Отметьте вашу команду как выполненную в вашем Command Handler | Трубопроводный Крюк | Опрос клиента

NEventStore дает вам идемпотентность для того же AggregateId (streamid) + CommitId, поэтому, если ваше приложение завершается сбоем до того, как команда помечена как обработанная, и вы воспроизводите свою команду, результирующие коммиты автоматически отбрасываются NES.

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

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

Если приложение аварийно завершает работу и служебная шина надежна (а не память), то событие / команда будет обработана снова автоматически, потому что служебная шина должна определить, не было ли сообщение успешно обработано. Конечно, по этой причине ваши обработчики сообщений должны быть идемпотентными.

Другие вопросы по тегам