Что это значит

Сервисы RX отправляют сообщения в RabbitMQ с подтверждением: брокер должен ответить, что сообщение принято и записано. Если ответ не пришёл за отведённое время, сервис пишет Error occurred while publishing <тип сообщения>, а внутри исключения стоит The message acknowledgment by RabbitMQ has timed out. Тип в тексте подсказывает, что не ушло: JobMessage это запуск фонового процесса, DelayOperationMessage отложенная операция, QueueHealthCheckMessage служебная проверка очередей.

Сообщение при этом может как дойти, так и потеряться: сервис знает только то, что подтверждения не дождался. Причина почти всегда на стороне брокера: он медленно пишет на диск, упёрся в лимит памяти или диска, или кластер RabbitMQ перестраивается после потери узла.

Как проверить

  1. Не включена ли защита брокера по памяти или диску: в этом режиме он блокирует публикацию.
rabbitmqctl status | grep -A3 -i alarm
rabbitmq-diagnostics check_local_alarms
  1. Все ли узлы кластера на месте и нет ли разделения сети:
rabbitmqctl cluster_status
  1. Задержка диска на узлах брокера (iostat -x 1 3): кворумные очереди пишут каждое сообщение на диск нескольких узлов, и медленный диск одного из них тормозит запись.
  2. Совпадают ли всплески по времени с перезапуском узлов RabbitMQ или с нагрузкой (массовая рассылка, импорт).

Что сделать

  1. Если сработала защита по диску или памяти, освободить место или память, разбор есть на страницах disk resource limit alarm и memory resource limit alarm.
  2. Вернуть потерянный узел кластера и дождаться синхронизации очередей.
  3. Держать брокер на быстрых дисках и не делить диск с базой данных или журналами.
  4. Мониторить время подтверждения и количество неподтверждённых публикаций: единичные ошибки в момент перезапуска узла нормальны, постоянный фон означает, что брокер не справляется.