为什么NServiceBus从两个不同的服务器接收通知?

时间:2011-12-02 14:22:58

标签: msmq nservicebus publish-subscribe

我的应用有两个组件。一个是通知程序进程(通知程序),它在介质服务器上运行,并在修改文件时使用NServiceBus发布消息。另一个是MVC Web应用程序(PhotoWeb),它订阅这些消息以执行缓存失效等。

我正在为QA设置暂存环境,问题是在暂存环境中运行的PhotoWeb应用程序正在从暂存介质服务器和实时媒体服务器接收通知 - 这是意外的,有点奇...

部署到生产中的PhotoWeb实例具有以下配置:

<MsmqTransportConfig InputQueue="PhotoWebInputQueue" ErrorQueue="PhotoWebErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5" />
<UnicastBusConfig>
  <MessageEndpointMappings>
    <clear/>
    <!-- Where do we subscribe to messages about filesystem changes? -->
    <add Messages="MyProject.Messages" Endpoint="NotifierInputQueue@webmedia"/>
  </MessageEndpointMappings>
</UnicastBusConfig>

以及暂存环境中的配置是:

<MsmqTransportConfig InputQueue="PhotoWebInputQueue" ErrorQueue="PhotoWebErrorQueue" NumberOfWorkerThreads="1" MaxRetries="5" />
<UnicastBusConfig>
  <MessageEndpointMappings>
    <clear/>
    <!-- Where do we subscribe to messages about filesystem changes? -->
    <add Messages="MyProject.Messages" Endpoint="NotifierInputQueue@staging_media"/>
  </MessageEndpointMappings>
</UnicastBusConfig>

有几种理论浮现在脑海中:

  1. 我误解了队列实际上是什么 - 而PhotoWebInputQueue实际上是共享网络资源而不是特定服务器本地的队列
  2. 之前的部署导致NServiceBus订阅登台Web服务器上的实时webmedia队列,并且此订阅将在重新启动等过程中持续存在。
  3. 但是,我的NServiceBus-fu不够强大,无法知道如何测试这些理论。您可以看到这种配置或架构明显错误吗?

    谢谢,

    迪伦

1 个答案:

答案 0 :(得分:3)

通知程序可以向两个订阅者发送消息的唯一方法是在通知程序的订阅存储中为两个订阅者订阅。订阅包括:

  • 消息类型(包括程序集,版本和公钥令牌)
  • 订阅者的输入队列地址。

当发布者收到消息时,它依次针对每个订阅评估消息,并将消息发送给每个匹配的订阅者。

如果您清除实时通知程序的订阅存储区,然后重新启动实时订阅服务器,则应解决此问题。