NServiceBus和DTC的问题

3

我正在使用NServiceBus中的Distributor并且遇到了有关DTC的困惑。

之前我只在跨进程时偶尔使用过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,以及是否存在我完全忽略的重大缺陷?
此致敬礼
1个回答

3
NServiceBus分发器与NServiceBus中DTC的使用并没有关联。无论您是否使用分发器,NServiceBus都将使用DTC。
当NSB分发器未被使用时,NSB分发器工作程序(甚至单台计算机上的各个工作线程)不会互相注册分布式事务。请注意,您永远不会在单个DTC事务中看到两个NSB工作线程。每个工作线程针对本地队列启动事务,然后将(很可能是远程的)数据库添加到事务中(使其成为分布式)。
这里有一个很好的概念说明:http://www.nservicebus.com/StopLosingData.aspx 我认为您没有错过任何重要的问题。只需解耦这两个概念:NSB分发器及NSB如何使用分布式事务。

谢谢。但我现在很好奇,为什么您有禁用DTC选项,使用IsTransactional(false)。禁用它会有什么好处?性能上的提升吗? - Christian Mikkelsen
1
IsTransactional 告诉 nsb 不要将接收操作加入到 tx 中。这意味着如果您的消息处理程序出现任何问题,消息将会丢失。Nsb 3 有一个 SupressDtc 配置选项,它仍然使用 tx 但避免 dtc。也就是说,跳过 dtc 的主要影响在于您必须如何实现业务逻辑。在调用之前,您可能应该进行研究? - Andreas Öhlund
因此,使用SupressDTC仍然可以确保在处理程序失败时不会丢失任何消息,但代价是处理程序必须手动处理任何数据库事务回滚等问题。 - Christian Mikkelsen
2
是的。DTC可以帮助您避免自己编写去重逻辑。 - Chris Bednarski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接