【发布时间】:2018-08-28 19:16:58
【问题描述】:
假设我在事务范围内登记了 Rebus 和数据库连接(例如 sql server 连接)。将在数据库连接上执行一些数据库操作,并由 Rebus 发布一些消息,并且事务范围不会升级到 MSDTC(我检查了 Windows 上没有分布式事务,并且这种情况在 Linux 上也适用于 MSDTC不支持)。 Complete() 在事务范围内调用,它指示数据库连接和 Rebus 提交。现在让我们假设数据库连接首先提交并成功,并且在 Rebus 可以提交(=发布消息)之前,机器崩溃了。会发生什么?我可以想到这些场景:
- 已提交数据库操作,但未发布任何消息(状态不正确)。
- 数据库操作被回滚(不确定谁作为 MSDTC 不会参与,并且当机器重新启动时,我认为没有人会检查崩溃期间事务发生了什么),并且没有发布任何消息(正确的状态)。
- 已提交数据库操作,并在机器重新启动(正确状态)后发布消息(由谁?)。
另外,我用 NServiceBus 检查了相同的场景,当与 MSMQ 一起使用时,事务范围升级到 MSDTC,并且 NServiceBus 的创建者声称事务范围的结果总是正确的——要么全部提交,要么全部回滚,无论机器是否在事务范围的任何点崩溃。
【问题讨论】:
-
> 和 NServiceBus 的创建者声称你能帮我一个忙并澄清你在哪里读到的吗?如果我们能更好地解释这一点,我们将不胜感激了解我们做得不够好的地方。
-
1/2 关于“NServiceBus 的创建者声称......” - 这是我对 Udi Dahan 谈话的印象:vimeo.com/111998645(时间 12:42 - “DTC 为您解决所有这些问题” ,时间 14:39“DTC 给您的一次且仅一次的消息传递”)。他谈到了 NServiceBus 5 中的一个实现,它应该在不使用 DTC 的情况下与 DTC 一样可靠,并且应该能够承受崩溃并且在任何代码行崩溃时都可靠。这次演讲给我的印象是,您可以将 NServiceBus 与 MSMQ/sql 服务器和 DTC 一起使用,并相信“它可以正常工作”。是不是这样?
-
2/2 是否存在带有 MSMQ/sql 服务器和 DTC 的 NServiceBus 不能“正常工作”的情况?例如机器在某个特殊点崩溃,导致事情无法按预期工作 - 消息错误地没有发布,或者发布了两次或多次?
-
只是一个大概的数字,但 MSMS + SQL 的可靠性约为 99.99%。如果您每秒发送 5 条消息,每分钟 300 条,每小时 18k 条,每年 650 万条,那么每年 657 条消息可能永远不会到达。再一次,只是一个大概的数字。情况可能不太糟。但这是可能的,因为没有什么是 100% 故障安全的。
-
那就是与 msdtc。当您不使用分布式事务时,丢失消息的数量可能会成倍增加。发件箱可以解决很多问题。
标签: .net nservicebus transactionscope rebus