【问题标题】:NServiceBus - two publishers, one subscriber, same message interfaceNServiceBus - 两个发布者,一个订阅者,相同的消息接口
【发布时间】:2012-08-05 04:41:32
【问题描述】:

我对 UnicastBusConfig、MsmqTransportConfig、 和一般的 MSMQ 队列。文档状态:

"订阅者的总线订阅发布者的方式是通过 向已配置的队列发送消息 部分”

我认为每个订阅者必须包含一个 MessageEndpointMapping 回到每个发布者的端点(或队列) 可能会发布订阅者处理的消息?

如果是这样的话,那么你如何配置多个 MessageEndpointMapping 用于相同的消息类型?不能有重复的值。

例如,给定 MyAssembly.IDoStuff,假设我有两个发布者 IDoStuff 和一个订阅者:

<UnicastBusConfig>
   <MessageEndpointMappings>
      <add Messages="MyAssembly" Endpoint="Publisher1" />
      <add Messages="MyAssembly" Endpoint="Publisher2" /> <-- runtime exception
   </MessageEndpointMappings>
</UnicastBusConfig>

这方面的商业案例很简单。假设订阅者是一个 FTP 进程,它获取一个文件并通过 FTP 将其输出。显然,您希望在整个企业的许多地方使用该功能。因此,有一个处理 ISendFile 的 FTP 订阅者,然后让每个需要 FTP 功能的发布者进程简单地发布 ISendFile 消息是有意义的。这就是我遇到的确切情况 - 我看不到解决办法。

请指教 - 谢谢!

【问题讨论】:

    标签: nservicebus


    【解决方案1】:

    正如 Kijana 在 nsb 列表中提到的,pub sub 的核心假设之一是发布者不应该了解其订阅者。甚至可能有 0 个订阅者,在您的示例中,从那时起不会执行任何 ftp 传输。这表明您应该改为执行 bus.Send(SendStuffUsingFtpCommand)。 NServiceBus 试图通过只允许给定消息类型的一个逻辑发布者来引导您走这条路。从技术上讲,这意味着每个消息类型只有一个消息映射条目,正如您所注意到的那样。

    【讨论】:

    • bus.Send 完成了工作,但感觉不对。它解决了多个发布者对一个订阅者的问题,但是当您想要多个订阅者时会发生什么?然后你必须恢复到 bus.Publish 并使用分销商。这是有道理的,我想。但是 Send vs. Publish 结构感觉太复杂了。
    • 我相信您正在考虑这样一种场景,即您有多个物理发布者用于相同的逻辑消息。想想旧的 + 新的 CRM 系统发布相同的 CustomerStatusUpdated 事件。这是受支持的,只需在端点之间共享订阅存储,并让您订阅其中一个(可能是新的 CRM)
    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    相关资源
    最近更新 更多