Итак, здесь происходит несколько вещей, которые я хотел бы затронуть.
Во-первых, ваш вопрос относительно поведения RabbitMQ. Указанное выше правило взято из спецификации AMQP-0-9-1 . Как и в большинстве реализаций открытых спецификаций, RabbitMQ не полностью соответствует. На этой странице подробно описывается, какие именно части спецификации реализованы и где возникают отклонения.
На этой странице указано, что «не предпринимается никаких попыток предотвратить повторную доставку одному клиенту». RabbitMQ перечисляет это как запланированное дополнение в будущем выпуске, но это было запланировано на несколько лет.
Должны ли потребители быть разборчивыми?
Более важный вопрос - это вопрос, который вы непосредственно не задавали, но который заключается в том, «должен ли мой потребитель быть разборчивым в отношении того, какие сообщения из очереди он обрабатывает?
Ответом на это является категорическое «нет». Одно из ключевых предположений при разработке очередей сообщений заключается в том, что любой потребитель, подписанный на очередь, должен иметь возможность обрабатывать любое сообщение в очереди. Таким образом, следует учитывать, что все потребители, подключенные к очереди, используют идентичный код (одна и та же база кода, одна и та же версия). Если нет, у вас рано или поздно возникнут серьезные проблемы с приложением.
Отклонить следует использовать только для сообщения брокеру о наличии проблемы с конкретным сообщением. Если есть проблема с конкретным потребителем (например, теряет соединение с базой данных), он не должен отклонять сообщение, а вместо этого должен закрывать соединение, инициируя повторную доставку другому работающему потребителю. По замыслу сообщения, которые должны обрабатываться специализированным или другим потребителем, должны помещаться в другую очередь.