nServiceBus: как сделать нетранзакционный вызов базы данных в контексте транзакционной операции

Краткий обзор нашей топологии:

Веб-сайты, отправляющие команды на сервер nServiceBus, который принимает команды и затем публикует правильные события pub / sub. Эта служба также имеет обработчики сообщений, которые могут выполнить какой-либо процесс с БД в ответ на команду, например:

1 пользователь регистрируется на веб-сайте. 2 веб-сайт отправляет команду nServicebus службе nServicebus на другом сервере. 3 Сервер nServicebus имеет обработчик для этого конкретного типа команды, который записывает что-то в базу данных и отправляет приветственное письмо

С момента создания этой архитектуры мы начали блокировать БД. Я проследил это до MSDTC на сервере базы данных. Если я отключу эту службу на сервере базы данных, nServicebus начнет выдавать ошибки, что для меня показывает, что nServiceBus привлекает обновление БД в транзакции.

Я не хочу, чтобы это произошло, я хочу самостоятельно обрабатывать ошибки БД, я хочу, чтобы транзакция обеспечивала доставку сообщения моей прокси-службе nServicebus. Я не хочу транзакции из Интернета через 2 сервера в БД и обратно.

Какие-либо предложения?

РЕДАКТИРОВАТЬ: этот пост предоставляет некоторые подсказки, однако я не совсем уверен, что это правильный способ продолжить.. NServiceBus - Проблема с использованием TransactionScopeOption.Suppress в обработчике сообщений

РЕДАКТИРОВАТЬ 2: Причина, по которой мы хотим, чтобы БД работала за пределами транзакции, заключается в том, что мы хотим "асинхронно" обрабатывать эти команды на другом сервере, чтобы не замедлять работу веб-сайта и / или не заставлять пользователей ждать этих длинных запуск агрегирующих команд. Если БД находится в рамках транзакции, блокирует ли это выполнение на веб-сайте в тот момент, когда исходная команда запускается распространителю? Есть ли лучшая архитектура nServicebus для этого сценария? Мы хотим, чтобы команда запускалась быстро и возвращала управление на веб-сайт, чтобы пользователь мог быстро продолжить работу, и нам не пришлось ждать нашей долго работающей команды БД, которая обновляет статистические значения, отправляет электронные письма и т. Д.

1 ответ

Я бы не рекомендовал работать с БД вне контекста транзакции NServiceBus. Вместо этого попробуйте уменьшить уровень изоляции транзакций. Это можно сделать, позвонив по телефону:

.IsolationLevel (System.Transactions.IsolationLevel.ReadCommited)

в свободной конфигурации. Вы должны будете поместить это после.MsmqTransport() в v2.6. В v3.0 вы можете поставить этот вызов практически в любом месте.

ОТВЕТ НА РЕДАКТИРОВАТЬ 2:

Простое использование NServiceBus позволит вам не замедлять работу сайта, независимо от уровня транзакций, выполняемых на другом сервере. Использование транзакций является гарантией того, что сообщения не будут потеряны в случае сбоя, а также что вам не придется писать собственную логику дедупликации.

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