Эту стратегию вы можете использовать с любой системой обмена сообщениями.
Я предполагаю, что у вас есть группа работников, которые слушают одну очередь с заданиями, которые нужно обработать.Теперь у вас может быть служба, позволяющая называть ее «Менеджер», которая дублирует эту очередь и сохраняет все не законченные сообщения.Теперь, когда работник заканчивает работу, он отправляет сообщение-подтверждение менеджеру.Диспетчер, например, отбрасывает все выполненные задания и сохраняет только один запуск(Если вы хотите принять во внимание допустимые сбои, это тоже можно отследить).Когда у менеджера больше нет сообщений, он публикует сообщение «все сообщения в группе готовых тем».Теперь издатели могут прослушивать эту тему и отправлять новые сообщения о вакансиях в «очередь заданий».
Конечно, в простом случае вы можете иметь одного производителя, который может одновременно быть менеджером.
Пример реализации RabbitMQ.
Теперь, чтобы реализовать это в RabbitMQ, вы можете, например, создать один FanoutExchange (для производителя для отправки сообщений) и две очереди jobsQueue (для отправки рабочих мест) иjobTrackingQueue (для отправки заданий в менеджер для отслеживания заданий).Теперь вы создаете второй FonoutExchange (для диспетчера, чтобы отправлять сообщения о выполненных задачах), вы создаете неназванную очередь для каждого производителя, который хочет знать, все ли сообщения выполнены.