RabbitMQ: отправлять фиксированные сообщения из очереди для нескольких потребителей - PullRequest
0 голосов
/ 09 марта 2019

Есть ли способ, с помощью которого мы можем ограничить очередь RabbitMQ для отправки только фиксированного количества сообщений из очереди потребителям?

У меня есть 2 очереди Q1 и Q2 и 10 потребителей. Каждый потребитель может обрабатывать сообщения из Q1 и Q2. В любой момент времени только 2 потребителя должны обрабатывать сообщения из Q2.Все 10 потребителей могут обрабатывать сообщения отQ1 одновременно.

Существует ли какая-либо конфигурация в RabbitMQ, которую мы можем указать, чтобы RabbitMQ отправлял только 2 сообщения из Q2 любому свободному потребителю и передавал следующие 2 только после того, как они были подтверждены, даже если другие потребители свободны и готовы кпотреблять.

Дополнительные сведения о проблеме:

Почему обрабатывается только 2 сообщения одновременно?: Сообщения Q2 выполняют вызов веб-службы, и конечная точка веб-службы (третье лицо) может одновременно обслуживать только 2 сообщения.

Не можем ли мы использовать параллелизм?: Если мы используем ListenerContainer (Spring AMQP), контейнер для каждого потребителя.Мы можем ограничить количество сообщений, которое может принимать один потребитель за один раз, но если у нас есть 10 потребителей, если в очереди есть сообщения, каждый потребитель получит свою долю.

Можем ли мы настроить только 2 потребителей, слушающихQ2?Я понимаю, что мы можем добиться этого, настроив только 2 потребителей для Q2, но я пытаюсь избежать этого.Если по каким-либо причинам эти 2 потребителя отключатся, обработка Q2 будет остановлена.Если сконфигурировано 10 потребителей, мы можем гарантировать, что обработка будет происходить до тех пор, пока не отключится последний потребитель.

Посмотрим, есть ли какая-либо конфигурация в RabbitMQ, которую мы можем использовать, или любое предлагаемое решение.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Я уверен, что потребительская предварительная выборка выполнит то, что вы хотите.Но у Q2 может быть только один потребитель, чтобы это работало.Нет возможности координировать действия нескольких потребителей - вам придется сделать это самостоятельно, и вы можете использовать RabbitMQ для координации.


ПРИМЕЧАНИЕ: команда RabbitMQотслеживает список рассылки rabbitmq-users и только иногда отвечает на вопросы в StackOverflow.

0 голосов
/ 09 марта 2019

Я думаю, что вы зациклены на определении проблемы. Что вам действительно нужно, так это тривиально, поэтому давайте разберемся с этим немного.

Учитывая две очереди, Q1 и Q2

  • 10 потребителей
  • Каждый потребитель может обрабатывать сообщения от Q1 и Q2.
  • В любой момент времени только 2 потребителя должны обрабатывать сообщения из Q2.
  • Все 10 потребителей могут одновременно обрабатывать сообщения из Q1.

Комментарии к постановке задачи

Во-первых, очереди предполагаются независимыми. Независимый процесс P будет иметь очередь Q, поэтому Q1 обслуживает процесс P1. Это строгое математическое требование - вы не можете определить две очереди для одного процесса P.

Таким образом, второе ограничение математически неверно, по той же причине, по которой вы не могли написать допустимую функцию, которая принимает параметры типа string и bool взаимозаменяемо. Он должен принимать один или другой, так как они не являются совместимыми типами, или он должен принимать одного общего предка типов без учета подтипов. Это вариант принципа замены Лискова .

Переопределение проблемы

Всего в системе 12 потребителей:

  • Q1 имеет 10 потребителей
  • Q2 имеет 2 потребителей
  • [Важно] Потребители не разделяются между очередями

Существует ли какая-либо конфигурация в RabbitMQ, которую мы можем указать, чтобы RabbitMQ отправлял только 2 сообщения из Q2 любому свободному потребителю и передавал следующие 2 только после их подтверждения, даже если другие потребители свободны и готовы к потреблению.

На основании нового определения проблемы у вас есть два варианта:

  1. Используйте Basic.Get - извлечь следующее сообщение из очереди, как только потребитель закончит обработку последнего сообщения.
  2. Использовать потребительскую предварительную выборку с лимитом 1. Это немедленно доставит первое и второе сообщения для каждого потребителя, а затем доставит дополнительные сообщения по одному, когда будет подтверждено следующее сообщение для этого потребителя. Это немного сложнее, но может иметь смысл, если ваша задержка меньше 10 миллисекунд.

Обратите внимание , что, правильно определив проблемное пространство, мы устранили фундаментальную проблему, пытаясь выяснить, как обеспечить, чтобы только два потребителя обрабатывали Q2 сообщений в любое время.

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