Обработчик слишком долго не подтверждал сообщение
Ошибка RabbitMQ «delivery acknowledgement timed out» под Directum RX: потребитель держал сообщение дольше consumer_timeout, брокер закрыл канал и вернул сообщение в очередь. Как найти долгий обработчик и что настроить.
Что это значит
С версии 3.8.15 RabbitMQ следит, сколько потребитель держит сообщение без подтверждения. По умолчанию предел 30 минут (consumer_timeout). Если обработчик не уложился, брокер закрывает канал с ошибкой PRECONDITION_FAILED (код 406) и возвращает сообщение в очередь. Сервис RX переподключается, берёт сообщение снова, и если обработка опять долгая, история повторяется по кругу.
Для пользователя это выглядит как задание или операция, которая «висит» и не завершается.
Как проверить
- Текущий таймаут:
rabbitmqctl eval 'application:get_env(rabbit, consumer_timeout).'
- Какая очередь: имя видно в логе брокера рядом с ошибкой. По имени понятно, какой обработчик RX её читает.
- Сколько сообщений в работе без подтверждения:
rabbitmqctl list_queues name messages_ready messages_unacknowledged consumers
Что сделать
- Найти, почему обработчик идёт дольше получаса: тяжёлый запрос к базе, большой документ, ожидание внешней системы. Это фактура для разработчиков.
- Если долгая обработка ожидаема (массовая операция, конвертация), увеличить
consumer_timeoutвrabbitmq.conf, значение в миллисекундах:
consumer_timeout = 7200000
- Не отключать таймаут совсем: без него зависший обработчик держит сообщения бесконечно, и этого никто не видит.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать