【问题标题】:Clarification of topology拓扑说明
【发布时间】:2012-10-02 14:08:16
【问题描述】:

我了解 Rebus 完全能够将消息从 A 点传输到 B 点(使用 MSMQ 作为传输层)。说清楚一点,Rebus 是否也能够进行一对多消息传递,即从 A 点发送的消息应该在 B 点和 C 点都结束?

如果可能的话,它是如何做到的?我看不到任何集中的分发站点(邮局),所以我假设通信将包括从每个端点到每个其他端点的通道(因此在一个进程必须与其他 5 个端点通信的网络中,有将有 5 个通道辐射出此过程)。你能证实这个假设吗?

【问题讨论】:

    标签: servicebus rebus


    【解决方案1】:

    是的,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())
        (...)
    

    【讨论】:

    • 所以我的想法是,如果我是(每日邮报的)出版商,那么我当然必须保留一份我所有订阅者的列表——没有邮局可以为我做这件事。但是,当我将消息发送给订阅者时,总线将确保消息安全传递。从这个观点来看,负责保存订阅我的服务的列表的并不是总线。谢谢你的回答。
    • 不,巴士会为你做这一切!当订阅存储配置如上所示,您的订阅者可以bus.Subscribe 而发布者可以bus.Publish - 无需额外的工作!
    猜你喜欢
    • 1970-01-01
    • 2017-10-11
    • 2011-08-19
    • 2011-03-29
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多