【问题标题】:NServiceBus Multicast Publish-Subscribe Channel with RabbitMQ Transport带有 RabbitMQ 传输的 NServiceBus 多播发布-订阅通道
【发布时间】:2017-01-10 19:40:42
【问题描述】:

技术栈:

  • .Net 4.6.1
  • 二郎18.3
  • 语言:C# 6
  • NServiceBus 6
  • RabbitMQ 3.6.3
  • Windows 7

上下文: 我们正在尝试在 RabbitMQ 传输上的 NServiceBus 中实现一个带有智能订阅的哑事件发布者。

  1. 所有感兴趣的接收者都订阅一个事件。
  2. 发布者将事件发布到事件通道。
  3. 所有订阅者都会收到一份活动副本。
  4. 请注意,我并没有说每个 TYPE 的订阅者都会收到一份消息副本。如果有多个服务实例正在运行,并且它们都对某个事件具有活动订阅,则订阅服务的每个实例都应获得消息的副本。

但是,NServiceBus 的 Publish-Subscribe 概念将发布的事件传递给给定通道上的一个且只有一个接收器。在我们的例子中,是给定订阅服务的一个实例。

我不愿列出消息传递“模式”,因为它们似乎没有被命名或描述得特别一致。但是,我相信我们实际上是在尝试实现企业集成模式(Hohpe 和 Woolf)书中发布-订阅通道消息传递模式的“多播”版本。

问题陈述: 我们的商业案例是这样的:

  1. 我们有一个配置服务,它为我们更广泛的应用程序中的所有其他服务提供应用程序配置。
  2. 每个服务在启动时通过发送 ConfigurationRequest 消息从配置服务请求其配置。
  3. 配置服务使用 ConfigurationResponse 回复发出 ConfigurationRequest 的特定实例。这是使用 NServiceBus 的全双工(通常称为请求-响应)功能完成的。
  4. 有一个网站可以全局修改配置。当它这样做时,它会使用 UpdateConfiguration 命令通知配置服务。
  5. 配置服务发布一个 ConfigurationUpdated 事件,所有其他服务都订阅了该事件。
  6. 每个服务可以有多个实例在不止一个服务器上运行。服务的所有实例都需要更新其配置,而不仅仅是一个实例。
  7. 每个服务实例都使用不同的鉴别器调用 NServiceBus 的 EndpointConfiguration.MakeInstanceUniquelyIdentifiable。
  8. 目前,当我们发布 ConfigurationUpdated 事件时,每种服务类型只有一个实例会收到消息。事件是循环分发的,而不是每个实例都获取消息的副本。

我们通过记录运行的服务实例并将 ConfigurationUpdated 事件(作为 NServiceBus 中的命令)单独发送给每个实例来解决这个问题,但 Pub-Sub 暗示我们应该有愚蠢的发布者和聪明的订阅者,我们的解决方法是相反的......我们的发布者查找每个订阅者的列表并隐式发送给它。我在订阅者端是否缺少一些配置,允许每个服务的每个实例获取已发布的 ConfigurationUpdated 事件的副本?如果没有,我应该在哪里查看 NServiceBus 以开始实现这样的功能?可能是路由拓扑?

【问题讨论】:

    标签: rabbitmq nservicebus messaging publish-subscribe


    【解决方案1】:

    我对 nservicebus 不够熟悉,不知道如何使用该工具集来完成它,但 RabbitMQ 实现将是一个“扇出”交换,每个消费者都有一个队列。

    绑定到扇出交换的每个队列都将获得消息的副本。如果每个队列都有一个消费者,那么您将向每个消费者发送消息的副本。

    听起来您有多个消费者连接到同一个队列。也许有办法告诉 nservicebus 为每个消费者实例创建一个队列?


    附言您对发布-订阅模式被多播是正确的。我在我的 RMQ 模式电子书 (https://leanpub.com/rmq-patterns) 中谈到了这一点,这也是 EIP 书的内容。

    【讨论】:

    • 我们从 Particular 得到的回复是他们故意不支持这种行为。我不明白为什么。他们不希望您“传达所有信息”。他们认为一个活动通常应该有一个发布者。他们建议我们在应用程序中使用 Redis,这可能是正确的答案。但是,我们的主管此时不想支持基础架构,因此我们构建了一个多播消息代理,将命令发送给每个接收者。丑陋,但它的工作非常可靠。感谢您的参与!
    • @EricBurcham 我和你有同样的问题。在继续使用消息代理之前,您是否查看过 MassTransit?我将研究它是否支持这种行为
    • @bayological 我们确实研究了 MassTransit,但它是在这项工作之前,并且已经决定使用 NServiceBus。我们没有根据这个需求重新评估 MassTransit,所以我不能告诉你它是否支持我们想要的行为。对不起。
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多