具有RabbitMQ传输的NServiceBus多播发布-订阅通道

具有RabbitMQ传输的NServiceBus多播发布-订阅通道,rabbitmq,nservicebus,messaging,publish-subscribe,Rabbitmq,Nservicebus,Messaging,Publish Subscribe,技术堆栈: .Net 4.6.1 Erlang 18.3 语言:C#6 N服务总线6 RabbitMQ 3.6.3 视窗7 上下文: 我们正在尝试在RabbitMQ传输上的NServiceBus中使用智能订阅实现哑事件发布器 所有感兴趣的接收者都订阅了一个活动 发布者将事件发布到事件频道 所有订阅者都会收到事件的副本 请注意,我并没有说每种类型的订阅者都会收到消息的副本。如果有多个服务实例正在运行,并且它们都具有对事件的活动订阅,则订阅服务的每个实例都应获得消息的副本 然而,NService

技术堆栈

  • .Net 4.6.1
  • Erlang 18.3
  • 语言:C#6
  • N服务总线6
  • RabbitMQ 3.6.3
  • 视窗7
上下文: 我们正在尝试在RabbitMQ传输上的NServiceBus中使用智能订阅实现哑事件发布器

  • 所有感兴趣的接收者都订阅了一个活动
  • 发布者将事件发布到事件频道
  • 所有订阅者都会收到事件的副本
  • 请注意,我并没有说每种类型的订阅者都会收到消息的副本。如果有多个服务实例正在运行,并且它们都具有对事件的活动订阅,则订阅服务的每个实例都应获得消息的副本
  • 然而,NServiceBus的发布-订阅概念将发布的事件传递给给定通道上的一个且仅一个接收器。在我们的例子中,给定订阅服务的一个实例

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

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

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

  • 我们通过保存运行服务实例的记录并将ConfigurationUpdated事件(作为NServiceBus中的命令)分别发送给每个实例来解决这个问题,但Pub-Sub意味着我们应该有哑发布者和智能订阅者,我们的解决方法正好相反。。。我们的发布者查找每个订阅者的列表并隐式发送给它。订户端是否缺少一些配置,这些配置允许每个服务的每个实例获得已发布的ConfigurationUpdate事件的副本?如果没有,我应该在NServiceBus中的什么地方开始实现这样的功能?路由拓扑,也许?

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

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

    听起来好像有多个使用者连接到同一队列。也许有一种方法可以告诉nservicebus为每个使用者实例创建一个队列



    p、 你说得对,酒吧子模式是多播的。我在我的RMQ模式电子书()中谈到了这一点,这也是EIP的书中所说的

    我们从Special得到的答复是,他们故意不支持这种行为。我不明白为什么。他们不想让你“传达所有的信息”,他们认为一个活动通常应该有一个出版商。他们建议我们在应用程序中使用Redis,这可能是正确的答案。然而,我们的潜在客户此时不想支持基础设施,因此我们构建了一个多播消息代理,向每个收件人发送命令。很难看,但它工作非常可靠。谢谢你叫我进来@我和你有同样的问题。在使用邮件代理之前,您是否看过MassTransit?我将对此进行调查,看看它是否支持这一点behaviour@bayological我们确实看过MassTransit,但它是在这项工作之前,并且已经决定使用NServiceBus。我们没有针对这一需求重新评估MassTransit,因此我无法建议您它是否支持我们想要的行为。很抱歉