Производитель работает последовательно хеширование потребителям через очередь сообщений?
-
26-09-2019 - |
Вопрос
У меня есть продюсер, который я хочу использовать работу последовательно по потребителям, согласованным хешированием. Например, с потребительскими узлами 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, и сообщения будут направляться в правильные очереди.
Было бы два потенциальных проблема с этим:
- Существует небольшое отставание между тем, когда потребитель присоединяется к бассейну и сообщениям по маршруту; Кроме того, если есть сообщения уже в очередях, можно для того, чтобы потребитель мог получить сообщения, предназначенные для другого потребителя (например, присоединения C3, продюсера, а C2 все еще получает некоторые сообщения E и F, потому что они уже были в очередь,
- Если потребитель умирает по любой причине, сообщения в очередь (и по пути к его очереди) будут потеряны; Это может быть решено путем рассылки и мертвой надписи сообщений соответственно.
Чтобы ответить на ваш последний вопрос, вы, вероятно, хотите использовать очередь и krackitmq - отличный выбор, но ваши требования (точнее «разделить работу последовательно»), не совсем не соответствует AMQP.
Другие советы
Вы могли бы использовать официальный последовательное перемешивание плагин для rabbitmq как ответил здесь