2015-02-06 5 views
0

У меня есть сервер RabbitMQ, в котором есть около 100 очередей, имеющих по 100 сообщений в каждом. Все очереди имеют одинаковые обменные и индивидуальные ключи маршрутизации. Я использую Spring amqp framework для взаимодействия с сервером RabbitMQ. У меня есть несколько приложений с использованием одного и того же сервера RabbitMQ (т. Е. Нескольких потребителей).RabbitMQ получает неподтвержденные сообщения

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

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

  1. Даже после правильного получения сообщений, почему иногда только ack не увенчался успехом.
  2. Даже если нет решения первой проблемы 1, как мне настроить мое приложение так, чтобы оно никогда не получало безостановочное (дублирующееся) сообщение.

    BTW поведение не было видно с самого начала создания приложения, оно начало вести себя таким образом в последнее время.

ответ

0

Взгляните на следующее:

  1. Semaphore queue реализован в Кролика. (возможно, вы можете использовать zookeeper или etcd для достижения этого)
  2. Когда вы получаете сообщение, у него есть флаг redelivered, который установлен, когда сообщение уже было потреблено другим пользователем, но по какой-то причине вернулось в очередь. Поэтому вы можете просто проверить это, и если он установлен, то отпустите сообщение.
Смежные вопросы