消息总线对象类型所有权

时间:2014-07-13 17:17:21

标签: c# message-queue rebus

我仍在处理我的消息队列概念,请参阅:Bus discovery in message busses

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

可能会有多个发布商发送一种邮件类型,因为不同的发布商可以针对不同目的使用相同的邮件类型执行不同的操作

  1. 这是否可行,尤其是在rebus中
  2. 订阅者如何知道要连接的发布者
  3. 感谢您阅读

1 个答案:

答案 0 :(得分:1)

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

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

如果选择随机发布者订阅(或您之前根本不知道),您可以

  1. 通过编辑订阅存储或

  2. 手动建立所有订阅
  3. 将端点配置为专用订阅管理器 - 这样,所有订阅者只需要了解订阅管理器,以便能够执行TEvent,然后所有内容都将连接为它应该

  4. 我希望这会清除它...如果你这样做,请告诉我它是如何为你工作的:)

    以下是选项#2

    的说明

    Illustration of option #2

    总之,为了完成这项工作,需要做的是:

    • 订阅管理器是配置了订阅存储的端点
    • 每个发布者(pub1,pub2,...)都是使用与订阅管理器相同的订阅存储的发布者,他们可以发布任何事件类型
    • 订阅者具有将所有消息类型映射到订阅管理器的端点映射 - 例如bus.Subscribe

    这种方式,顺序如下:

    1. 订阅者(例如sub1)调用<add messages="AssemblyWithAllMyEvents" endpoint="subscriptionManager.input"/>
    2. 订阅消息由Rebus发送到订阅管理器(因为消息类型映射到订阅管理器)
    3. 订阅管理器将订阅保留在订阅存储中
    4. 发布商(例如pub1)调用bus.Subscribe<MyMessage>()
    5. Rebus查看订阅存储以查看哪些端点已订阅bus.Publish(new MyMessage())
    6. Rebus循环遍历这些端点并将MyMessage实例发送到sub1,可能还有其他
    7. 以下是不需要的:

      • 订阅者无需将任何消息类型映射到任何发布者
      • 订阅管理器和发布者根本不需要任何端点映射