Retained message в MQTT нужен, чтобы новый подписчик сразу получил последнее состояние топика. Если broker не сохраняет retained сообщение, устройство или панель могут видеть пустое состояние до следующей публикации.

Сначала проверьте, действительно ли publisher отправляет сообщение с retain flag, и не очищает ли другой клиент retained-сообщение пустым payload.

Коротко: что делать

  • Проверить retain=true при публикации
  • Подписаться новым клиентом на тот же topic
  • Проверить QoS и ACL для publish/subscribe
  • Проверить persistence broker и настройки storage
  • Проверить, не публикуется ли пустое retained сообщение для очистки

Основные причины

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

  • Publisher не устанавливает retain flag
  • ACL запрещает retained publish или доступ к topic
  • Broker запущен без persistence, и данные теряются после рестарта
  • Другой клиент очищает retained message пустым payload
  • Topic отличается из-за регистра, слеша или wildcard

Пошаговая диагностика

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

  • Опубликовать тестовое retained message через mosquitto_pub
  • Подписаться новым клиентом через mosquitto_sub
  • Проверить логи broker по ACL и persist
  • Проверить настройки retained messages в конкретном broker
  • Сравнить точный topic publish и subscribe

Как исправить проблему

Исправление должно закрывать корневую причину, а не только внешний симптом. Если проблема связана с доступами, платежами, данными или безопасностью, сначала стоит сделать резервную копию и проверить правку на тестовом сценарии.

  • Исправить publish с retain=true
  • Настроить ACL на нужный topic
  • Включить persistence и проверить права на storage
  • Запретить случайную очистку retained message
  • Добавить тест retained-сообщений в диагностику устройств

Безопасный план решения

Проверяйте retained-сообщения на отдельном тестовом топике. Не меняйте глобальные настройки broker без понимания, какие устройства используют retain.

Чего не стоит делать

  • Не путать retained message с обычной доставкой QoS
  • Не очищать retained payload пустым сообщением случайно
  • Не использовать wildcard как фактический topic публикации
  • Не отключать ACL ради быстрой проверки на production

Что подготовить перед исправлением

  • Тип MQTT broker
  • Topic, где нет retained message
  • Команда или код публикации
  • Настройки persistence и ACL

FAQ

QoS 1 гарантирует retained?

Нет. QoS отвечает за доставку, retain — отдельный флаг сохранения последнего сообщения.

Почему после рестарта retained пропадает?

Вероятно, выключена persistence или broker не может записать данные на диск.

Как очистить retained message правильно?

Опубликовать retained-сообщение с пустым payload в тот же topic, но делать это нужно осознанно.

Когда стоит обратиться за помощью

Помощь нужна, если MQTT связан с датчиками, устройствами, панелями мониторинга или автоматикой, где последнее состояние критично.

Итог

Начните с тестовой публикации retain=true и нового подписчика. Если нужно настроить MQTT broker, ACL и retained messages, можно написать в Telegram @rabotator_support.