Почему NServiceBus получает уведомления от двух разных серверов? - PullRequest
0 голосов
/ 02 декабря 2011

Мое приложение состоит из двух компонентов. Одним из них является процесс уведомлений (Notifier), который выполняется на медиа-сервере и публикует сообщение с помощью NServiceBus при изменении файла. Второе - это веб-приложение MVC (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 подписывался на оперативную очередь веб-мультимедиа на промежуточном веб-сервере, и эта подписка сохраняется при перезапусках и т. Д.

Однако мой NServiceBus-fu недостаточно силен, чтобы знать, как проверить любую из этих теорий. Что-то явно не так с этой конфигурацией или архитектурой, которую вы видите?

Спасибо

Dylan

1 Ответ

3 голосов
/ 02 декабря 2011

Единственным способом, которым ваш уведомитель может отправлять сообщения обоим подписчикам, является наличие подписки для обоих подписчиков в хранилище подписок уведомителя. Подписка состоит из:

  • Тип сообщения (включая сборку, версию и маркер открытого ключа)
  • Адрес очереди ввода абонента.

Когда издатель получает сообщение, он по очереди оценивает сообщение по каждой подписке и отправляет сообщение каждому соответствующему подписчику.

Если вы очистите хранилище подписки живого уведомителя, а затем перезапустите действующего подписчика, это должно решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...