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 позволит вам не замедлять работу сайта, независимо от уровня транзакций, выполняемых на другом сервере. Использование транзакций является гарантией того, что сообщения не будут потеряны в случае сбоя, а также что вам не придется писать собственную логику дедупликации.