【发布时间】:2017-01-10 19:40:42
【问题描述】:
技术栈:
- .Net 4.6.1
- 二郎18.3
- 语言:C# 6
- NServiceBus 6
- RabbitMQ 3.6.3
- Windows 7
上下文: 我们正在尝试在 RabbitMQ 传输上的 NServiceBus 中实现一个带有智能订阅的哑事件发布者。
- 所有感兴趣的接收者都订阅一个事件。
- 发布者将事件发布到事件通道。
- 所有订阅者都会收到一份活动副本。
- 请注意,我并没有说每个 TYPE 的订阅者都会收到一份消息副本。如果有多个服务实例正在运行,并且它们都对某个事件具有活动订阅,则订阅服务的每个实例都应获得消息的副本。
但是,NServiceBus 的 Publish-Subscribe 概念将发布的事件传递给给定通道上的一个且只有一个接收器。在我们的例子中,是给定订阅服务的一个实例。
我不愿列出消息传递“模式”,因为它们似乎没有被命名或描述得特别一致。但是,我相信我们实际上是在尝试实现企业集成模式(Hohpe 和 Woolf)书中发布-订阅通道消息传递模式的“多播”版本。
问题陈述: 我们的商业案例是这样的:
- 我们有一个配置服务,它为我们更广泛的应用程序中的所有其他服务提供应用程序配置。
- 每个服务在启动时通过发送 ConfigurationRequest 消息从配置服务请求其配置。
- 配置服务使用 ConfigurationResponse 回复发出 ConfigurationRequest 的特定实例。这是使用 NServiceBus 的全双工(通常称为请求-响应)功能完成的。
- 有一个网站可以全局修改配置。当它这样做时,它会使用 UpdateConfiguration 命令通知配置服务。
- 配置服务发布一个 ConfigurationUpdated 事件,所有其他服务都订阅了该事件。
- 每个服务可以有多个实例在不止一个服务器上运行。服务的所有实例都需要更新其配置,而不仅仅是一个实例。
- 每个服务实例都使用不同的鉴别器调用 NServiceBus 的 EndpointConfiguration.MakeInstanceUniquelyIdentifiable。
- 目前,当我们发布 ConfigurationUpdated 事件时,每种服务类型只有一个实例会收到消息。事件是循环分发的,而不是每个实例都获取消息的副本。
我们通过记录运行的服务实例并将 ConfigurationUpdated 事件(作为 NServiceBus 中的命令)单独发送给每个实例来解决这个问题,但 Pub-Sub 暗示我们应该有愚蠢的发布者和聪明的订阅者,我们的解决方法是相反的......我们的发布者查找每个订阅者的列表并隐式发送给它。我在订阅者端是否缺少一些配置,允许每个服务的每个实例获取已发布的 ConfigurationUpdated 事件的副本?如果没有,我应该在哪里查看 NServiceBus 以开始实现这样的功能?可能是路由拓扑?
【问题讨论】:
标签: rabbitmq nservicebus messaging publish-subscribe