transactions - NServiceBus:MSMQ 事务不是很糟糕吗?

标签 transactions nservicebus distributed-transactions

我正在学习 NServiceBus 和 MSMQ。有人告诉我 MSMQ 中的事务队列很糟糕,使用它们对性能来说真的很糟糕。有谁知道为什么?我猜这来自于它使用 DTC 的概念,每个人都知道 DTC 并不是真正的可扩展解决方案。在我看来,带有 NServiceBus 的 MSMQ 并不是那么糟糕有几个原因,但我不知道我是否完全理解它是如何工作的。从逻辑上看,我可以想到 NServiceBus 可能使用事务来保证交付的 3 个地方:

  • 通过网络发送消息时,您可能希望使用事务来确保消息在丢弃之前已到达远程队列。
  • 从本地队列读取消息时,您可能希望在丢弃它之前确保它被成功处理。
  • 将消息发布给多个订阅者时,您可能希望在丢弃它之前确保它到达所有订阅者。 (我真的希望这不是 NServiceBus 所做的)

  • 谁能告诉我 NServiceBus 如何做到这一点?

    最佳答案

    Msmq 事务不保证接收者已经收到消息。该事务保证消息已被您机器上的 msmq 基础结构接收到,如果消息是持久的(NSB 中的默认值),这意味着它已持久保存在磁盘上,并且可以在重新启动后继续存在。然后消息将由 msmq 传递,而不会阻止调用者。这更好地称为“存储转发”

  • 默认情况下,MSMQ 仅保证您的本地 msmq 基础结构已收到消息。不需要接收服务器在线。虽然可以启用此功能(请参阅下面约翰的回答)
  • 这是 IMO 的 NSB 的主要卖点之一。使用跨本地队列和数据存储(即分布式事务)的事务的能力对于保证一致性至关重要。即,如果出现故障,您的数据存储中不会保留任何内容,并且消息将回滚并重试,而用户无需执行任何操作。
  • 与#1 相同。唯一的保证是每个订阅者最终都会收到发布的消息。只要您有可用的磁盘空间和发布服务器,就不会进行阻塞调用,调用将立即返回。

  • 希望这可以帮助!

    关于transactions - NServiceBus:MSMQ 事务不是很糟糕吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3515372/

    相关文章:

    php - Mysql事务: Effect on other Transaction query

    c# - 编辑队列中的 MSMQ 消息

    .net - 原子性 : Database transaction and Windows Azure

    c# - 带事务的 MySQL 表锁

    java - Hibernate 一级和二级缓存如何与多个 session 一起工作

    json.net - DataBusProperty<byte[]> 上的 NServiceBus MessageDeserializationException

    domain-driven-design - 领域驱动设计概念和与 CQRS 的关系

    spring-cloud - Spring Cloud Stream Kafka - 最终一致性 - Kafka 是否自动重试未确认的消息(使用 autocommitoffset=false 时)

    java - 如何使用 hibernate Transaction API 管理并发

    mysql - cftransaction 不回滚错误时创建表