【问题标题】:NServicebus: can I have message rollback without DTC?NServicebus:我可以在没有 DTC 的情况下进行消息回滚吗?
【发布时间】:2012-03-01 16:36:16
【问题描述】:

据我了解,NServicebus 以这种方式工作 - 它使用 DTC 将所有数据库事务与消息事务一起包装,并在出现故障时回滚所有内容。

现在,我不需要 NServicebus 来处理我的数据库事务 - 我会自己处理它们 - 因为我不想使用 DTC(nservicebushost 和 sql server 位于不同的 ec2 实例上,并且我认为我无法在 ec2 实例上打开 RPC 端口),但我不希望在处理失败的情况下丢失消息 - 如果出现异常,我希望重试并在 max retries 消息被移动到错误队列。

我可以将 Nservicebus 配置为这样吗?

【问题讨论】:

    标签: c# nservicebus


    【解决方案1】:

    这里的问题与您的 ec2 实例的崩溃有关。 DTC 保证即使在崩溃的情况下消息也不会丢失。

    另一个选项是在您的处理程序中抑制环境事务:

    using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))

    在 3.0 中,我们将介绍一种在 NServiceBus 本身中完成此操作的方法。在流畅的初始化代码中可能会调用 .SuppressDTC()(或类似的东西)。

    【讨论】:

    • 我明白这一点,但我希望有其他选择。假设我有自己的消息传递实现并且正在做不同的事情 - 我正在偷看消息,尝试处理它,如果处理成功 - 从队列接收消息,所以这与使用事务一样可靠,尽管它有缺点 - 它会在多线程场景中不起作用,但如果我知道我在单线程中运行(我知道,因为我使用的是非商业 nservicebus),我可以使用这种机制来避免 DTC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多