RabbitMQ - обновлена ​​до новой версии и получила множество "PRECONDITION_FAILED неизвестных ярлыков доставки 1",

Просто обновлена ​​до новой версии RabbitMQ - 2.3.1 - и теперь возникает следующая ошибка:

PRECONDITION_FAILED unknown delivery tag 1  

... за которым следует закрытие канала. Это работало на более раннем RabbitMQ без каких-либо изменений на стороне клиента.


С точки зрения поведения приложения:

Когда приложение A хочет отправить асинхронное сообщение в приложение b и получить ответ от B, это алгоритм:

  • Приложение A генерирует уникальный идентификатор и помещает его в объект сообщения
  • Затем приложение А подписывается на новую очередь с именем очереди и ключом маршрутизации, равным uuid.
  • Приложение B откройте сообщение, выполните некоторые вычисления и верните результат в канал с помощью маршрутизируемого ключа, который он получил.
  • Приложение A получает ответ и закрывает очередь.

До сих пор все пошло очень хорошо в 1.7.0. что пошло не так в 2.3.1?


Когда приложение A вызывает basicPublish(), приложение B сразу бросает следующее исключение:

com.rabbitmq.client.ShutdownSignalException: channel error; reason: {#method<channel.close>(reply-code=406,reply-text=PRECONDITION_FAILED - unknown delivery tag 1,class-id=60,method-id=80),null,""}
    at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:191)
    at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:159)
    at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:110)
    at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:438)
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; reason: {#method<channel.close>(reply-code=406,reply-text=PRECONDITION_FAILED - unknown delivery tag 1,class-id=60,method-id=80),null,""}

Ответы

Ответ 1

Единственная кодировка, которая может вызвать это исключение, заключается в том, что брокер обрабатывает "basic.ack", поэтому это звучит как проблема с клиентом; проверьте код клиента.

В частности, убедитесь, что вы не используете сообщения более одного раза. Это нарушает спецификацию AMQP 0-9-1:

Сообщение НЕ ДОЛЖНО быть подтверждено более одного раза. Принимающий одноранговый узел ДОЛЖЕН подтвердить, что ненулевой тег доставки относится к доставленному сообщению и вызывает исключение канала, если это не так.

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

Также стоит отметить, что предыдущие версии Rabbit были более слабыми и в этом случае не выдавали ошибку, но более поздние версии.

Ответ 2

Просто установите noAck: false на BasicConsume метод