Сервис RX не дождался от RabbitMQ подтверждения, что сообщение принято
«Error occurred while publishing JobMessage» (а также QueueHealthCheckMessage, DelayOperationMessage, Byte[]) и «The message acknowledgment by RabbitMQ has timed out» в логах Directum RX: брокер не подтвердил приём сообщения вовремя. Почему брокер тормозит и что проверить.
Что это значит
Сервисы RX отправляют сообщения в RabbitMQ с подтверждением: брокер должен ответить, что сообщение принято и записано. Если ответ не пришёл за отведённое время, сервис пишет Error occurred while publishing <тип сообщения>, а внутри исключения стоит The message acknowledgment by RabbitMQ has timed out. Тип в тексте подсказывает, что не ушло: JobMessage это запуск фонового процесса, DelayOperationMessage отложенная операция, QueueHealthCheckMessage служебная проверка очередей.
Сообщение при этом может как дойти, так и потеряться: сервис знает только то, что подтверждения не дождался. Причина почти всегда на стороне брокера: он медленно пишет на диск, упёрся в лимит памяти или диска, или кластер RabbitMQ перестраивается после потери узла.
Как проверить
- Не включена ли защита брокера по памяти или диску: в этом режиме он блокирует публикацию.
rabbitmqctl status | grep -A3 -i alarm
rabbitmq-diagnostics check_local_alarms
- Все ли узлы кластера на месте и нет ли разделения сети:
rabbitmqctl cluster_status
- Задержка диска на узлах брокера (
iostat -x 1 3): кворумные очереди пишут каждое сообщение на диск нескольких узлов, и медленный диск одного из них тормозит запись. - Совпадают ли всплески по времени с перезапуском узлов RabbitMQ или с нагрузкой (массовая рассылка, импорт).
Что сделать
- Если сработала защита по диску или памяти, освободить место или память, разбор есть на страницах disk resource limit alarm и memory resource limit alarm.
- Вернуть потерянный узел кластера и дождаться синхронизации очередей.
- Держать брокер на быстрых дисках и не делить диск с базой данных или журналами.
- Мониторить время подтверждения и количество неподтверждённых публикаций: единичные ошибки в момент перезапуска узла нормальны, постоянный фон означает, что брокер не справляется.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать