Повторное получение сообщения RabbitMQ тому же потребителю, который отклонил его - PullRequest
0 голосов
/ 02 июля 2018

У меня есть очередь и сообщения в ней. Также у меня есть два потребителя в отдельных процессах. Я беру сообщение по одному и решаю, что это сообщение не мое, и отклоняю его с флагом запроса. В документации я нашел следующую фразу: «Сервер НЕ ДОЛЖЕН доставлять сообщение одному и тому же клиенту в контексте текущего канала». Значит ли это, что отклоненное сообщение должно быть доставлено другому потребителю или нет?

1 Ответ

0 голосов
/ 02 июля 2018

Итак, здесь происходит несколько вещей, которые я хотел бы затронуть.

Во-первых, ваш вопрос относительно поведения RabbitMQ. Указанное выше правило взято из спецификации AMQP-0-9-1 . Как и в большинстве реализаций открытых спецификаций, RabbitMQ не полностью соответствует. На этой странице подробно описывается, какие именно части спецификации реализованы и где возникают отклонения.

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

Должны ли потребители быть разборчивыми?

Более важный вопрос - это вопрос, который вы непосредственно не задавали, но который заключается в том, «должен ли мой потребитель быть разборчивым в отношении того, какие сообщения из очереди он обрабатывает?

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

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

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