1

我仍在研究我的消息队列概念,请参阅:消息总线中的总线发现

我有另一个问题。我有一个通用类型库,即存储订阅者和接收者可以发送和接收的所有类型的库。

一种消息类型可能从多个发布者发送,因为不同的发布者可以出于不同的目的使用相同的消息类型做不同的事情

  1. 这有可能起作用吗,尤其是在rebus中
  2. 订阅者如何知道要连接哪个发布者

谢谢阅读

4

1 回答 1

1

可以使用 Rebus 进行这项工作 - 很难说这是否是推荐的方法,但这应该有效:

如果您让所有不同类型的发布者共享相同的订阅存储(例如,通过将订阅存储在共享 SQL Server 的同一个表中) ,那么bus.Subscribe<TEvent>对其中任何一个发布者的订阅将​​导致订阅其中任何一个TEvent发布的任何发布者。

如果选择一个随机发布者进行订阅(或者您事先根本不知道),您可以

  1. 通过编辑订阅存储手动建立所有订阅,或

  2. 将端点配置为专用订阅管理器 - 这样,所有订阅者只需要知道订阅管理器即可bus.Subscribe执行

我希望这可以清除它...如果您这样做,请告诉我它对您的效果:)

这是选项#2的说明

选项 #2 的插图

总而言之,为了完成这项工作,需要以下内容:

  • 订阅管理器是一个配置了订阅存储的端点
  • 每个发布者 (pub1, pub2, ...) 是使用与订阅管理器相同的订阅存储的发布者,他们可以发布任何事件类型
  • 订阅者具有将所有消息类型映射到订阅管理器的端点映射 - 例如<add messages="AssemblyWithAllMyEvents" endpoint="subscriptionManager.input"/>

这种方式,顺序如下:

  1. 订户(例如 sub1)呼叫bus.Subscribe<MyMessage>()
  2. Rebus 将订阅消息发送到订阅管理器(因为消息类型映射到订阅管理器)
  3. 订阅管理器将订阅持久化在订阅存储中
  4. 发布者(例如 pub1)调用bus.Publish(new MyMessage())
  5. Rebus 查看订阅存储以查看哪些端点已订阅MyMessage
  6. Rebus 在这些端点上循环并将MyMessage实例发送到 sub1,可能还有其他

IOW 不需要的是以下内容:

  • 订阅者不需要将任何消息类型映射到任何发布者
  • 订阅管理器和发布者根本不需要任何端点映射
于 2014-07-28T09:57:05.533 回答