RabbitMQ фанат на тему обмена - PullRequest
3 голосов
/ 10 марта 2011

Довольно плохо знаком с RabbitMQ, и мы все еще находимся на стадии исследования, чтобы посмотреть, подходит ли оно для наших случаев использования -

Мы с готовностью пришли к выводу, что наша желаемая топология будет иметь насразвертывание нескольких тематических обменов, а затем фильтрация оттуда к определенным очередям.Например, допустим, у нас есть пользователь и обмен загрузками, где очередь пользователя может получать сообщения, где тема «new-registration» или «friend-request», а обмен загрузками может получать сообщения типа «video-upload» или«картинка загрузки».

Создание очередей, их маршрутизация в соответствующую очередь, а затем создание слушателей для обработки сообщений для различных очередей было довольно простым делом.

Что мне неясно, однако, возможно ли сделать разветвление в обмене темами?

Т.е. я назвал очереди, которые связаны с моим обменом темами, но я хотел бы иметь возможность просто бросать тонны экземпляров моих слушателей в эти очереди, чтобы предотвратить отдельные точки отказа.Но, насколько мне известно, RabbitMQ обрабатывает этих слушателей прямым циклическим образом - например, каждое N-е сообщение всегда направляется одному и тому же N-му слушателю, а не отправляет сообщения первому доступному потребителю.Это в целом приемлемо для нас, но, учитывая ожидаемую нами нагрузку, мы бы хотели избежать возможности возникновения горячих точек в нашей потребительской ферме.

Итак, есть ли какой-то путь, либо в конфигурации очереди, либо в конфигурации обменаили в потребительском коде, где мы можем указать нашим слушателям на очередь тем, но обработать слушателей в режиме разветвления?

Ответы [ 3 ]

5 голосов
/ 20 марта 2011

Да, если слушатели связываются, используя разные имена очередей, они будут обрабатываться в режиме разветвления.

Разветвление равно 1: N, то есть каждая задача может быть доставлена ​​нескольким слушателям, например pub-sub. Обратите внимание, что это не ограничивается обменом разветвлениями, но также применяется, если вы связываете несколько очередей с прямым или тематическим обменом с одним и тем же ключом привязки. (Установка подключаемого модуля управления и поиск там обменов могут быть полезны для визуализации действующих привязок.)

Ваша текущая настройка - очередь задач. Каждое задание / сообщение доставляется ровно одному работнику / слушателю. Добавьте больше слушателей к одному и тому же имени очереди, и они будут обрабатывать задачи циклически, как вы говорите. С "fanout" (отдельные очереди для темы) вы будете обрабатывать задачу несколько раз.

В зависимости от вашей платформы могут существовать решения для рабочих очередей, отвечающие вашим требованиям, такие как Resque или DelayedJob для Ruby, Celery для Python или, возможно, Octobot или Akka для JVM.

0 голосов
/ 19 ноября 2015

Это поздний ответ, но в случае, если другие сталкиваются с этим вопросом ... Похоже, что вы хотите, чтобы это была справедливая рассылка, а не модель разветвления (которая бы публиковала данное сообщение в каждой очереди).

Справедливая отправка даст сообщение следующему доступному работнику, вместо того, чтобы использовать простой циклический подход. Это должно исключить «горячие точки», которые вас беспокоят, без доставки одного и того же сообщения нескольким потребителям.

Если это то, что вы ищете, см. Раздел «Справедливая отправка» на этой странице в Документах Rabbit. Ключ prefetch здесь равен 1.

0 голосов
/ 10 марта 2011

Не знаю точно, но я сильно подозреваю, что RabbitMQ пропустит потребителей с неподтвержденными сообщениями, поэтому он никогда не должен становиться узким местом для одного застрявшего потребителя. Комментарии к их FAQ , по-видимому, предполагают, что RabbitMQ приложит все усилия, чтобы все продолжалось, даже в присутствии проблемных потребителей.

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