使用RabbitMQ Transport的NServiceBus多播发布 - 订阅频道

时间:2017-01-10 19:40:42

标签: rabbitmq nservicebus messaging publish-subscribe

技术堆栈

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

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

  1. 所有感兴趣的接收者都订阅了一个活动。
  2. 发布商将活动发布到活动频道。
  3. 所有订阅者都会收到该活动的副本。
  4. 请注意,我没有说每个订阅者都收到该邮件的副本。如果有多个服务实例正在运行,并且它们都有活动的订阅,则订阅服务的每个INSTANCE都应获得该消息的副本。
  5. 然而,NServiceBus' Publish-Subscribe的概念将已发布的事件传递给给定频道上的一个且只有一个接收者。在我们的例子中,给定订阅服务的一个实例。

    我犹豫是否列出了短信"模式"因为他们似乎没有特别一致地被命名或描述。但是,我相信我们正在努力实施" Multicast" Enterprise Integration Patterns(Hohpe and Woolf)Book中的Publish-Subscribe Channel消息模式的版本。

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

    1. 我们有一个配置服务,可以为更广泛的应用程序中的所有其他服务提供应用程序配置。
    2. 每个服务都会在启动时通过发送 ConfigurationRequest 消息从配置服务请求其配置。
    3. 配置服务回复使用 ConfigurationResponse 进行 ConfigurationRequest 的特定实例。这是使用NServiceBus'全双工(通常称为请求 - 响应)功能。
    4. 有一个网站可以全局修改配置。执行此操作时,它会使用 UpdateConfiguration 命令通知配置服务。
    5. 配置服务发布所有其他服务订阅的 ConfigurationUpdated 事件。
    6. 每个服务可以在多个服务器上运行多个实例。所有服务实例都需要更新其配置,而不仅仅是一个实例。
    7. 每个服务实例都在调用NServiceBus' EndpointConfiguration.MakeInstanceUniquelyIdentifiable具有独特的鉴别器。
    8. 目前,当我们发布 ConfigurationUpdated 事件时,每种服务类型只有一个实例获取该消息。这些事件是循环分发的,而不是每个实例都获得该消息的副本。
    9. 我们通过保留运行服务实例的记录并将 ConfigurationUpdated 事件(作为NServiceBus中的命令)单独发送给每个人来解决此问题,但Pub-Sub意味着我们应该有愚蠢的发布者和聪明的订阅者,我们的解决方法正好相反......我们的发布者查找每个订阅者的列表并隐式发送给它。订阅者端是否缺少某些配置,允许每个服务的每个实例获取已发布的 ConfigurationUpdated 事件的副本?如果没有,我应该在哪里查看NServiceBus以开始实现这样的功能?路由拓扑,也许?

1 个答案:

答案 0 :(得分:1)

我对nservicebus不太熟悉,知道如何使用该工具集,但RabbitMQ实现将是一个"扇出"与每个消费者的队列交换。

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

听起来你有多个消费者连接到同一个队列。也许有一种方法可以告诉nservicebus为每个消费者实例创建一个队列吗?

P.S。你对pub-sub模式是多播是正确的。我在我的RMQ模式电子书(https://leanpub.com/rmq-patterns)中谈到这一点,以及EIP书中所说的内容。