nServiceBus: как сделать нетранзакционный вызов базы данных в контексте транзакционной операции - PullRequest
1 голос
/ 22 марта 2012

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

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

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

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

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

Есть предложения?

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

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

1 Ответ

2 голосов
/ 22 марта 2012

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

.IsolationLevel (System.Transactions.IsolationLevel.ReadCommited)

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

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

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

...