使用 Rebus,您可以轻松实现您所描述的行为,方法是让所有三个服务端点共享相同的订阅存储,例如中央 SQL Server/MongoDB/RavenDB/PostgreSQL 数据库,然后让每个订阅者通过自己订阅来建立订阅.
为了订阅自己,端点必须是所有消息类型的所有者,例如通过在 app.config 中具有以下 Rebus XML:
<configSections>
<section name="rebus" type="Rebus.Configuration.RebusConfigurationSection, Rebus" />
</configSections>
<rebus inputQueue="myOwnInputQueue" errorQueue="sharedErrorQueue@anotherMachine">
<add messages="SomeMessageAssembly" endpoint="myOwnInputQueue"/>
</rebus>
这样,每个端点只需要执行 abus.Subscribe<SomeMessage>()
即可注册为该特定消息类型的订阅者,并且从那时起SomeMessage
,无论哪个端点发布它,它都将处理所有已发布的 s(注意:包括它自己!)
如果端点需要按谁发送它来过滤传入消息,它可以检查rebus-return-address
标头以便例如忽略它自己发布的消息。
如果您想以上述数据库选项之外的其他方式集中您的订阅存储,您可以使用您自己的实现,IStoreSubscriptions
将订阅存储在其他地方或使用其他逻辑来决定谁接收给定类型的消息。
查看IStoreSubscriptions wiki 页面以获取更多信息和灵感 :)
那有意义吗?
更新:我忍不住了,我不得不尝试 - 查看Rebus 示例存储库中的MessageBus 示例- 这是我在此处描述的解决方案的 POC,它使用共享 XML 文件来存储订阅。