Как узнать, когда все подписчики заполнены?

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

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

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

LoggingSubscriber1 и LoggingSubscriber2 подписываются с подпиской "LoggingSubscriber", поэтому только один из них получает запрос.

Будут другие группы, такие как DoProcessSubscriber1, DoProcessSubscriber2 и DoProcessSubscriber3

И еще один DoOtherProcessSubscriber1, DoOtherProcessSubscriber2

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

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

1 ответ

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

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

Другие вопросы по тегам