Сбой транзакций NES (.NET Event Sourcing)? - PullRequest
1 голос
/ 24 августа 2011

Я пробую NES 0.3 (https://github.com/elliotritchie/NES), но у меня возникают проблемы с пониманием того, что происходит. Я запускаю пример приложения, в котором я изменил конфигурацию EventStore на SQL-сервер и вставил исключение непосредственно перед тем, как выполнение покидает SendMessageCommandHandler.Handle.().

Затем я запускаю обработчик и веб-сайт. Я создаю нового пользователя, который работает хорошо. Одно событие зарегистрировано в моей таблице EventStore. Затем я пытаюсь отправить сообщение. Это не удается из-за моегоисключение. Таким образом, событие NServiceBus не было отправлено из-за транзакционного характера шины. НО в EventStore событие зарегистрировано и помечено dispatched = 1 .

Чего мне не хватает?Конечно, это не должно было быть зарегистрировано как отправленное, когда оно не было отправлено NServiceBus? Единственное сообщение в очереди ошибок - "SendMessageCommand". Вероятно, мое понимание неверно, поэтому я подумал, что я должен спросить здесь, прежде чем сообщать об этомкак вопрос к автору.

Ответы [ 2 ]

1 голос
/ 28 августа 2011

Версия NES http://nuget.org/List/Packages/NES версии 0.3.0.1 теперь будет фиксировать любые изменения только после успешной работы всех ваших обработчиков.

Вы все равно должны рассмотреть возможность управления идемпотентностью сообщения самостоятельно. Вы можете сделать это несколькими способами:

EventStore по умолчанию подавляет любые внешние транзакции при фиксации изменений в базе данных. Однако если вы используете SQL Server или Raven, вы можете изменить TransactionScopeOption в EventStore на Required, что должно гарантировать, что транзакция будет распределена с использованием MSDTC, и все будет обработано за вас.

Альтернативой использованию 2PC может быть ведение журнала всех полученных сообщений и использование его для принятия / отклонения обработки конкретного сообщения. Пример такого подхода можно найти здесь: http://blog.jonathanoliver.com/2010/04/extending-nservicebus-avoiding-two-phase-commits/

1 голос
/ 25 августа 2011

Под капотом NES использует проект EventStore.По умолчанию каждая фиксация не считается отправленной до тех пор, пока не будет вызван MarkAsDispatched ().В результате я бы предположил, что что-то вызывает этот метод в неожиданном месте.

Прежде всего, у вас запущен единственный экземпляр EventStore.Убедитесь, что у вас не запущены два экземпляра.Кроме того, я бы рекомендовал пройтись по обработчику, чтобы выяснить, в какой момент фиксация помечается как отправленная.

...