我知道 Rebus 完全有能力将消息从 A 点传输到 B 点(使用 MSMQ 作为传输层)。为了让事情变得非常清楚,Rebus 是否也能够进行一对多的消息传递,即从 A 点发送的消息应该在 B 点和 C 点都结束?
如果有可能,它是如何做到的?我看不到任何集中的分发站点(邮局),所以我假设通信将包括从每个端点到每个其他端点的通道(因此在一个进程必须与其他 5 个端点通信的网络中,有将有 5 个通道辐射出此过程)。你能证实这个假设吗?
我知道 Rebus 完全有能力将消息从 A 点传输到 B 点(使用 MSMQ 作为传输层)。为了让事情变得非常清楚,Rebus 是否也能够进行一对多的消息传递,即从 A 点发送的消息应该在 B 点和 C 点都结束?
如果有可能,它是如何做到的?我看不到任何集中的分发站点(邮局),所以我假设通信将包括从每个端点到每个其他端点的通道(因此在一个进程必须与其他 5 个端点通信的网络中,有将有 5 个通道辐射出此过程)。你能证实这个假设吗?
是的,Rebus 确实能够向几乎任意数量的订阅者发布消息。确实,MSMQ(至少在其最基本的操作模式下)是一个简单的点对点通道,这就是为什么在顶部有一个层来实现真正的发布/订阅。
它的工作方式是,每个订阅者都有一个指向发布者的端点映射,然后每个订阅者去
bus.Subsribe<SomethingInterestingHappened>();
这会导致向发布者发送内部SubscriptionMessage
消息。然后发布者必须记住谁订阅了每个给定的消息类型,通常通过将此信息存储在 SQL Server 中。所有这些都是自动发生的,它只需要您配置某种订阅存储。
然后,当需要发布某些东西时,发布者会去
bus.Publish(new SomethingInterestingHappened { ... });
这将使 Rebus 查找给定消息类型的所有订阅者。这可能是0、1或更多,然后事件将被发送到每个订阅者的输入队列。
您可以在有关路由的页面上的 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())
(...)