【问题标题】:MassTransit's Subscription Service is a single point of failureMassTransit 的订阅服务是单点故障
【发布时间】:2014-07-13 03:41:53
【问题描述】:

我正在尝试通过 MSMQ 配置 MassTransit。我需要使用订阅服务,因为我不能使用多播,因为:

  • 我正在通过多个子网进行通信,并且
  • 我需要持久订阅

我不明白为什么系统设计成如果订阅服务没有运行,你就不能初始化总线实例。延迟后,您会收到“等待订阅服务响应超时”。

我认为这与消息队列的想法背道而驰,即消息会一直保留到接收者可用为止。我认为与订阅服务的通信是通过 mt_subscriptions 队列完成的,并且启动不会依赖于正在运行的订阅服务。

【问题讨论】:

  • 有解决方案吗?我正在处理同样的问题
  • 我放弃了公共交通并搬到了nservicebus,所以我不能给你指导。对不起
  • 您的体验如何?
  • 好。这是一个商业产品,但支持基础设施值得每一分钱

标签: msmq soa masstransit


【解决方案1】:

最有可能发生的事情是消息正像您所怀疑的那样被添加到队列中,但是错误处理会吐出特定的错误消息,因为它知道在另一端期待订阅服务。也许您无法初始化总线实例的原因是因为它没有检测到总线另一端的其他东西(订阅服务),因此它不会发送消息。

订阅服务可能充当中间人并确定何时/何地发送消息。因此,订阅服务需要运行才能在 mt_subscriptions 中将消息排入队列而不会出现错误。

【讨论】:

  • 您对 Masstransit 有任何工作知识,还是只是猜测?
  • 我在一些应用程序中使用了 MSMQ,但没有使用 MassTransit。我看过MassTransit,我认为我说的是对的。它必须遵守 MSMQ 中规定的规则,因为它使用 MSMQ 进行通信。根据我对 MSMQ 的理解,它需要订阅服务来确定消息的路由位置和时间。
【解决方案2】:

因此,订阅服务是您持久化和管理订阅的方式。如果它没有运行,那么就没有办法告诉消息它应该被路由到哪里。它也是唯一存储订阅的地方。如果你愿意,你可以做静态路由,手动配置一切。但归根结底,MSMQ 需要额外的 pub/sub 基础设施。没有办法解决这个问题。

您看到超时的原因是,当 MT 启动时它会说“嘿,我在这里,这是我的消费者。公共汽车上的其他消费者是什么?”因此订阅服务需要及时响应以获取该信息。如果没有注册订阅,则消息不仅仅是帮助 - 它丢失了。

如果你想要更简单的东西,你将不得不使用 RabbitMQ。您不需要运行订阅服务,因为 RMQ 中的交换绑定会为您处理这些。

【讨论】:

  • 所以如果你说的是对的,那么订阅服务就是单点故障。有没有办法在同一个 MassTransit 基础设施中运行 2 个订阅服务实例?
  • 您必须运行 Windows 集群才能进行故障转移。这是使用 MSMQ 处理它的唯一方法。一旦您的服务开始运行,订阅服务失败就意味着没有新人可以加入公共汽车。只要不停止现有成员,它们就会继续运行。
猜你喜欢
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多