NServiceBus и DTC

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

Question:
To ensure durable messaging with NSB, is it absolutely necessary to use DTC's?

Причина, по которой я спрашиваю, заключается в том, что я ожидаю, что NSB сможет обнаружить любое исключение, скажем, в обработчике, и, следовательно, отреагировать на ошибку, не удаляя сообщение из очереди. Следовательно, нет необходимости в DTC. Это, конечно, означает, что любой доступ к базе данных или внешней службе в обработчике потребует от программиста выполнения собственных откатов и т. д. И по этой причине DTC кажется лучшим способом. Итак, я полностью за DTC (если я правильно их понимаю), поскольку они, с моей точки зрения, гарантируют, что сообщения никогда не будут потеряны из очередей, а обработка сообщений никогда не будет повреждена, если обработчики реализованы правильно и другие внешние службы участвуют в DTC. .

Но я не уверен, тем более, что уважаемый парень из группы обслуживания серверов использовал предложение "DTC причинит вам мир боли!", когда я предложил активировать DTC на сервере базы данных с помощью его... Но ему еще предстоит прийти с аргументом относительно того, почему я так мучаюсь с кодами неисправности... :/.

Может ли кто-нибудь хорошо разбираться в DTC и NSB, пожалуйста, помогите мне прояснить, полностью ли я ошибаюсь в своем понимании DTC и есть ли какая-то большая ловушка, которую я полностью пропустил с DTC?

С уважением


person Christian Mikkelsen    schedule 08.03.2013    source источник


Ответы (1)


Дистрибьютор NServiceBus и использование DTC в NServiceBus не имеют ничего общего друг с другом. DTC будет использоваться NServiceBus независимо от того, используете ли вы дистрибьютор или нет.

Рабочие дистрибьютора NSB (и даже отдельные рабочие потоки на одном компьютере, когда дистрибьютор NSB не используется) не задействуют друг друга в распределенных транзакциях. Позвольте мне повторить, вы никогда не увидите два рабочих потока NSB в одной транзакции DTC. Каждый рабочий поток запускает транзакцию в локальной очереди, а затем добавляет (вероятно, удаленную) базу данных в транзакцию (что делает ее распределенной).

Хорошая иллюстрация концепции здесь

Я не думаю, что вы пропускаете какие-то большие подводные камни. Я бы просто разделил две концепции: дистрибьютор NSB и то, как NSB использует распределенные транзакции.

person Chris Bednarski    schedule 09.03.2013
comment
Спасибо. Но теперь мне любопытно, почему у вас есть возможность отключить DTC с помощью IsTransactional (false). Что можно получить, отключив его? Спектакль? - person Christian Mikkelsen; 09.03.2013
comment
IsTransactional указывает nsb не зачислять операцию получения в tx. Это означает, что сообщение будет потеряно, если что-то пойдет не так в вашем обработчике сообщений. Nsb 3 имеет параметр конфигурации SupressDtc, который по-прежнему использует tx, но избегает dtc. Тем не менее, основные последствия пропуска dtc заключаются в том, как вы должны реализовать свою бизнес-логику. Вы, наверное, должны изучить это, прежде чем звонить? - person Andreas Öhlund; 09.03.2013
comment
Таким образом, использование SupressDTC по-прежнему гарантирует отсутствие потери сообщений в случае сбоя обработчика, но цена заключается в том, что обработчик затем должен, например, вручную обрабатывать любые откаты транзакций БД и т. д.? - person Christian Mikkelsen; 09.03.2013
comment
Да. DTC избавляет вас от необходимости самостоятельно писать логику дедупликации - person Chris Bednarski; 09.03.2013