То, что вы описываете, выполнимо в RabbitMQ.
Ваша установка будет выглядеть примерно так:
- производитель публикует сообщение для обмена темой;давайте назовем его constant_divider;
- когда потребитель присоединяется к пулу, подключается к брокеру и создает исключительную очередь со своим именем, но периодически не привязывает его к чему-либо
- производителюопрашивает брокера (возможно, используя rabbitmqctl list_consumers), чтобы проверить, изменились ли потребители;если они есть, он удаляет все существующие привязки и при необходимости перепривязывает очереди;
- , когда производитель публикует, сообщениям присваивается ключ маршрутизации, соответствующий их типу задачи.
Итак, если у вас есть 6 типов задач: A, B, C, D, E, F и только два потребителя C1 и C2, ваши привязки будут выглядеть следующим образом: C1 привязан 3 раза к constant_divider с ключами маршрутизации A, B и C;C2 привязан 3 раза к c_d с помощью ключей маршрутизации D, E и F.
Когда C3 присоединяется к пулу, производитель видит это и соответственно перепривязывает очереди.
Когда производитель публикует, он отправляетсообщения с помощью routing_keys A, B, C, D, E и / или F, и сообщения будут перенаправлены в правильные очереди.
Возможны две возможные проблемы:
- Существует небольшая задержка между тем, когда потребитель присоединяется к пулу, и сообщениями направляются в него;также, если в очередях уже есть сообщения, для потребителя возможно получить сообщения, предназначенные для другого потребителя (например, присоединения C3, переподготовка производителя, но C2 все еще получает некоторые сообщения E и F, потому что они уже были в его очереди),
- Если потребитель по какой-либо причине умирает, сообщения в его очереди (и по пути в его очередь) будут потеряны;Эту проблему можно решить, переиздав и переписав сообщения соответственно.
Чтобы ответить на последний вопрос, вы, вероятно, захотите использовать организацию очередей, и RabbitMQ - отличный выбор, но ваши требования (точнее,немного «делим работу последовательно») не совсем подходят к AMQP.