Как реализовать конкурирующих потребителей потребителей, которые могут потреблять несколько вещей? - PullRequest
0 голосов
/ 22 февраля 2019

Я бы хотел реализовать конкурирующих потребителей с помощью RabbitMQ, у меня есть 2 (или более) потребителя:

Потребитель 1 может потреблять сообщения типа "красный" и типа "синий"
Потребитель 2может принимать сообщения типа «красный» и типа «черный»

Теперь я хотел бы иметь балансировку нагрузки между потребителями (и, возможно, большим количеством экземпляров потребителей с одинаковыми конфигурациями), используя шаблон конкурирующих потребителей иЯ бы хотел, чтобы порядок сообщений не изменялся "свободно" (мне не нужен идеальный порядок, но я хотел бы, чтобы сообщение от 2 часов назад было обработано раньше, чем от 2 минут назад).

Пример: Iхотели бы обработать следующие сообщения следующим образом:

  • Синий: потребитель 1
  • Черный: потребитель 2
  • Красный: потребитель, который первым завершил обработку(предположим, Потребитель 1)
  • 10 миллионов красных сообщений: оба потребителя будут конкурировать за сообщения и обрабатывать их
  • 1 миллион синих сообщений: только после всех 10 миллионов rПосле того, как потребитель 1 завершит работу с синими сообщениями, он должен начать обрабатывать новые красные сообщения, так как черные сообщения для потребителя отсутствуют, когда потребитель готов к обработке синих сообщений.
  • 1 миллион красных сообщений.2 он может немедленно начать обработку красных сообщений.

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

Если RabbitMQ не является подходящим инструментом для работы, может быть, есть что-то более подходящее?

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете решить эту проблему, используя priority queue.Придавая более высокий приоритет сообщениям red, ваш consumers будет сначала получать сообщения red.Если больше не осталось сообщений red, ваш consumers начнет потреблять сообщения blue.

При использовании priority queue убедитесь, что вы сохранили меньшее значение basic.qos.Это позволяет приоритетным сообщениям в очереди.

...