2013-10-11 2 views
1

У нас есть куча запросов, которые мы планируем опубликовать в очереди.Как узнать, когда все подписчики завершены?

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

Например Request1 помещается в очередь

LoggingSubscriber1 и LoggingSubscriber2 как подписаться с «LoggingSubscriber» SubscriptionId так, что только один из них получает запрос.

Там будут другие группы, такие как DoProcessSubscriber1, DoProcessSubscriber2 и DoProcessSubscriber3

И еще DoOtherProcessSubscriber1, DoOtherProcessSubscriber2

Нам нужен способ, чтобы знать, что все три абонента (Logging, DoProcess и DoOtherProcess) завершили, так что мы можем выполнить некоторые действия ... например, отправить клиенту сообщение о завершении всего всего запроса.

Как мы будем комбинировать ответы, подобные этому? Мы думали, что каждый абонент помещает объект ответа в очередь, но мы все еще не уверены, как узнать, что все сделано.

+0

Я предлагаю вам использовать какой-то счетчик в RequestObject, чтобы каждый абонент увеличивал его, как только закончил работу, тогда вы можете сравнить этот счетчик с ожидаемым значением (для вас - 3) и решить. Не забывайте, что этот счетчик будет совместным ресурсом в многопоточной среде, поэтому нужна какая-то синхронизация. –

+0

. Я не хочу жестко заданного значения, если мы добавим другой тип подписчика, нам не следует в идеале изменять конфигурацию ожидаемого стоимость. Я считаю, что элементы остаются в очереди, пока все подписчики не будут правильно настроены? Так не существует способа, чтобы что-то случилось в то время? – CaffGeek

+0

Как вы знаете, сколько подписчиков в вашем списке - сравнивайте не с жестким кодом, а с такой длиной –

ответ

1

В идеале вы использовали шаблон Request/Response, встроенный в EasyNetQ, но предназначенный для одного (потенциально фермерского) потребителя. Это не позволяет вам связываться с несколькими очередями. В вашем случае вы, вероятно, должны настроить ваш клиент для подписки на подписки и чтобы все три службы опубликовали сообщение, когда оно будет завершено. Затем клиент может дождаться ответа от всех трех до обновления.

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

Смежные вопросы