据我所知,NServicebus以这种方式工作 - 它使用DTC将所有数据库事务与消息事务一起包装,如果发生故障,则将所有内容回滚。
现在,我不需要,NServicebus将处理我的数据库事务 - 我会自己处理它们 - 因为我不想使用DTC(nservicebushost和sql server在不同的ec2实例上,我认为我不能在ec2实例上打开RPC端口),但我不希望在处理失败的情况下丢失消息 - 如果发生异常,我想重试并在最大重试后将消息移动到错误队列。
我可以将Nservicebus配置为这样吗?
答案 0 :(得分:5)
这里的问题与你的ec2实例的崩溃有关。 DTC保证即使在崩溃的情况下也不会丢失消息。
另一个选项是禁止处理程序中的环境事务:
using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
在3.0中,我们将介绍一种在NServiceBus中完成此操作的方法。它可能是在您的流畅初始化代码中调用.SuppressDTC()(或类似的东西)。