Обработка сообщений очереди сервисной шины Azure

У меня есть два потребителя (разные приложения), подключенные к очереди Azure. Я могу либо ReceiveAndDelete, либо PeekLock сообщения, а во время потребления могу complete() или abandon() сообщение. Ссылка: http://msdn.microsoft.com/en-us/library/azure/hh851750.aspx.

Я уверен, что хочу использовать PeekLock, а затем abandon() сообщения, так как я хочу, чтобы они были получены в обоих приложениях. Я решил, что в качестве механизма удаления я бы установил время жизни сообщения в очереди на 10 секунд.

Однако, поскольку кажется, что сообщения удаляются через 10 секунд, они продолжают публиковаться в обоих приложениях снова и снова в течение этих 10 секунд. Должен ли я создать какое-то настраиваемое обнаружение дублирования или я вообще использую неправильный подход?


person Ropstah    schedule 30.10.2014    source источник


Ответы (1)


По моему опыту, когда вы используете PeeKLock, вам почти всегда нужно будет завершить работу с помощью метода Complete. Метод Abandon создает дублирование, поскольку он никогда не помечается как «выполненный».

Рассматривали ли вы использование шаблона тем / подписок служебной шины или, возможно, фильтров? Если я правильно понимаю ваш сценарий, возможно, это именно то, что вам нужно. Вы можете отправить в очередь 2 сообщения с разными темами или фильтрами, определяющими, для какого приложения они предназначены.

http://azure.microsoft.com/en-us/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/

Пожалуйста, дайте мне знать, поможет ли это или это не соответствует вашей ситуации.

С наилучшими пожеланиями...

person DanielG    schedule 30.10.2014
comment
Кажется, это именно то, что я искал. Спасибо! - person Ropstah; 31.10.2014
comment
Однако после реализации результат кажется таким же. Мне нужно иметь несколько подписок на фильтр AllMessages. На этом этапе сообщение, отправленное с определенной темой, получено только одним из двух приложений (кажется случайным). После complete() он исчезнет, ​​и другие приложения его больше не получат. Это не имеет смысла согласно документу, который гласит: Теперь, когда сообщение отправляется в TestTopic, оно всегда будет доставляться получателям, подписанным на подписку на тему AllMessages, и выборочно доставляться получателям, подписанным на ... - person Ropstah; 31.10.2014
comment
Сможете ли вы отправить сообщение дважды? В первом используйте фильтр, например DestinedForAppA, а в другом - DestinedForAppB. В качестве альтернативы отправьте одно сообщение с помощью DestinedForAppA, а затем, когда это сообщение будет обработано, создайте другое сообщение от этого потребителя, у которого есть DestinedForAppB. В этой модели сообщение нужно отправить только один раз, и потребитель фильтра A создает новое сообщение в очереди для потребителя Fitler B. Это всего лишь идеи, поэтому прошу прощения, если мои ответы не имеют смысла. :-) Только пытаюсь помочь, потому что чувствую твою боль. - person DanielG; 31.10.2014
comment
Я читал об этом подходе, и ваш комментарий имеет смысл. Однако подход не работает. AppA не имеет абсолютно ничего общего с AppB, и при аналогичном подходе, когда AppC (издатель) отправляет несколько сообщений (по одному для каждого приложения), неудобно увеличивать нагрузку на AppC, чтобы он отправлял сообщение для каждого подписчика (ServiceBus ) очередь. Это похоже на работу для Azure. Что, если, например, у меня в очереди подписано 50 приложений? Разве нельзя просто добавить больше подписчиков, которые начнут получать сообщения, без изменения существующих приложений? - person Ropstah; 04.11.2014
comment
Единственное, что, на мой взгляд, может помочь, - это использование очередей Azure и обновление сообщений на месте или использование служебной шины Azure для сеансов сообщений. Концепция та же; каждый раз, когда потребитель читает сообщение, он проверяет значение, оставленное предыдущим потребителем, и решает, какое приложение получит информацию. Он обновляет сообщение для следующего потребителя. Наконец, если последнее приложение было обновлено, оно удаляет сообщение. Вы можете добавить больше подписчиков, но каким-то образом вы должны знать, когда обработка завершена и сообщение может быть удалено без дублирования. - person DanielG; 04.11.2014
comment
Итак, потребитель может редактировать (или отмечать) сообщение, и это значение указывается по ссылке, поэтому abandon() он откажется от отредактированного сообщения для других потребителей? - person Ropstah; 08.11.2014