是的,Rebus 确实能够向几乎任意数量的订阅者发布消息。确实,MSMQ(至少在其最基本的操作模式下)是一个简单的点对点通道,这就是为什么在上面有一层来实现真正的 pub/sub。
它的工作方式,是每个订阅者都有一个端点映射指向发布者,然后每个订阅者去
bus.Subsribe<SomethingInterestingHappened>();
这会导致向发布者发送内部SubscriptionMessage。然后发布者必须记住谁订阅了每个给定的消息类型,通常通过将此信息存储在 SQL Server 中。所有这些都是自动发生的,只需要您配置某种订阅存储。
然后,当需要发布某些内容时,发布者就会离开
bus.Publish(new SomethingInterestingHappened { ... });
这将使 Rebus 查找给定消息类型的所有订阅者。这可能是0、1或更多,然后将事件发送到每个订阅者的输入队列。
您可以在page about routing 上的 Rebus 文档中阅读有关这些内容的更多信息。
要提示您如何配置订阅者和发布者,请查看 - 这是订阅者:
Configure.With(...)
.Transport(t => t.UseMsmq....)
.MessageOwnership(t => t.FromRebusConfigurationSection())
(...)
它还有一个端点映射,将一堆事件映射到特定的发布者:
<endpoints>
<add messages="SomePublisher.Messages" endpoint="publisher_input_queue" />
</endpoint>
然后发布者可能如下所示:
Configure.With(...)
.Transport(t => t.UseMsmq....)
.Subscriptions(s => s.StoreInSqlServer(theConnectionString, "subscriptions")
.EnsureTableIsCreated())
(...)