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

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

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

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

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

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

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

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

EDIT2: Причина, по которой мы хотим, чтобы БД работала вне области транзакции, заключается в том, что намерение состоит в том, чтобы «асинхронно» обрабатывать эти команды на другом сервере, чтобы не замедлять работу веб-сайта и / или заставлять пользователей ждать так долго. выполнение команд агрегации. Если БД находится в рамках транзакции, блокирует ли это выполнение на веб-сайте в точке, где исходная команда отправляется дистрибьютору? Есть ли лучшая архитектура nServicebus для этого сценария? Мы хотим, чтобы команда запускалась быстро и возвращала управление веб-сайту, чтобы пользователь мог быстро продолжить работу и не ждать нашей долгой работы команды БД, которая обновляет совокупные счетчики и отправляет электронные письма и т. Д.


person Tom DeMille    schedule 22.03.2012    source источник


Ответы (1)


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

.IsolationLevel (System.Transactions.IsolationLevel.ReadCommited)

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

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

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

person Udi Dahan    schedule 22.03.2012
comment
Спасибо за ответ Уди. Почему бы вам не порекомендовать это? Эти конкретные команды БД - своего рода огонь и забыть, и не имеет значения, если они иногда не работают для нас. Мы используем nSvcBus (в случае этих команд) просто как способ перенести работу с веб-сервера на другой сервер. - person Tom DeMille; 22.03.2012
comment
Причина, по которой мы хотим, чтобы БД работала вне области транзакции, заключается в том, что здесь цель состоит в том, чтобы «асинхронно» обрабатывать эти команды на другом сервере, чтобы не замедлять работу веб-сайта, см. Мой «Edit2» выше. - person Tom DeMille; 22.03.2012