Производитель работает последовательно хеширование потребителям через очередь сообщений?

StackOverflow https://stackoverflow.com/questions/3621772

Вопрос

У меня есть продюсер, который я хочу использовать работу последовательно по потребителям, согласованным хешированием. Например, с потребительскими узлами X и Y, задачи A, B, C должны всегда переходить к потребителю X, а D, E, F для потребителя Y. Но это может сдвинуть немного, если z присоединяется к пулу потребителей.

Я не хотел справиться со своей собственной логикой для подключения к узлам потребительских узлов и особенно не с управляющими узлами, присоединившимися и выходя из бассейна, поэтому я снился на путь использования rabbitmq, а также эксклюзивная очередь на узел для потребителей Отказ

Одна проблема, в которой я работаю, - это перечисление этих очередей, поскольку производитель должен знать все доступные очереди перед распределением работы. AMQP даже не поддерживает очереди листинга, что делает меня неопределенным в целом подход. Рабитмк и Алиса (сломленно в данный момент) Добавьте эту функциональность, хотя: Есть ли API для листинга очередей и обменов на rabbitmq?

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

Это было полезно?

Решение

То, что вы описываете, это умеет в rabbitmq.

Ваша настройка будет что-то вроде:

  • Производитель публикует сообщение на обмен теми; Давайте назвать это согласованным_divider;
  • Когда потребитель, присоединяется к бассейну, он соединяется с брокером и создает эксклюзивную очередь с его именем, но не связывает этого ни к чему
  • Производитель периодически опроса брокера (может быть, используя rabbitmqctl list_consumers), чтобы проверить, изменялись ли потребители; Если у них есть, он удаляет все существующие привязки и воспитывает очереди по мере необходимости;
  • Когда производитель публикует, сообщения назначаются ключ маршрутизации, который соответствует их типу задачи.

Таким образом, если у вас есть 6 типов задач: A, B, C, D, E, F и только два потребителя C1 и C2, ваши привязки будут выглядеть как: C1, связанный 3 раза, чтобы согласовать_divider с ключами маршрутизации A, B и C; C2 связан 3 раза до C_D с клавишами маршрутизации D, E и F.

Когда C3 присоединяется к бассейну, производитель видит это и воспитывает очереди соответственно.

Когда продюсер публикует, он отправляет сообщения с MARTING_KEYS A, B, C, D, E и / или F, и сообщения будут направляться в правильные очереди.

Было бы два потенциальных проблема с этим:

  1. Существует небольшое отставание между тем, когда потребитель присоединяется к бассейну и сообщениям по маршруту; Кроме того, если есть сообщения уже в очередях, можно для того, чтобы потребитель мог получить сообщения, предназначенные для другого потребителя (например, присоединения C3, продюсера, а C2 все еще получает некоторые сообщения E и F, потому что они уже были в очередь,
  2. Если потребитель умирает по любой причине, сообщения в очередь (и по пути к его очереди) будут потеряны; Это может быть решено путем рассылки и мертвой надписи сообщений соответственно.

Чтобы ответить на ваш последний вопрос, вы, вероятно, хотите использовать очередь и krackitmq - отличный выбор, но ваши требования (точнее «разделить работу последовательно»), не совсем не соответствует AMQP.

Другие советы

Вы могли бы использовать официальный последовательное перемешивание плагин для rabbitmq как ответил здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top