Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Темы

Сервер MQTT доставляет сообщение каждой подписке, фильтр которой подходит к его теме, одному участнику группы совместной подписки и хранит сохранённые сообщения.

Одна публикация в devices/dev42/telemetry: сервер копирует её в каждую подходящую подписку, одному участнику группы совместной подписки и хранит её, если она сохраняемаяГруппа workersИздатель отправляет в темуdevices/dev42/telemetryСервер MQTTсверяеттемус фильтромкаждойподпискиdevices/dev42/telemetryта же темаdevices/+/telemetry+ - один уровеньdevices/## - остатокdevices/+/stateне подходитdevices/+/telemetryучастник 1 получаетdevices/+/telemetryучастник 2 нетСохранённое сообщениепоследнее в темеПодписка,что появится позжеСообщение без подходящей подпискиотбрасывается, если оно не сохраняемое
Схема текстом
  1. Группа workers: devices/+/telemetry участник 1 получает; devices/+/telemetry участник 2 нет
  2. Издатель отправляет в тему devices/dev42/telemetry → Сервер MQTT сверяет тему с фильтром каждой подписки: PUBLISH
  3. Сервер MQTT сверяет тему с фильтром каждой подписки → devices/dev42/telemetry та же тема
  4. Сервер MQTT сверяет тему с фильтром каждой подписки → devices/+/telemetry + - один уровень
  5. Сервер MQTT сверяет тему с фильтром каждой подписки → devices/# # - остаток
  6. Сервер MQTT сверяет тему с фильтром каждой подписки → devices/+/telemetry участник 1 получает
  7. Сервер MQTT сверяет тему с фильтром каждой подписки → Сохранённое сообщение последнее в теме: с флагом retain
  8. Сохранённое сообщение последнее в теме → Подписка, что появится позже
  9. devices/+/state не подходит
  10. Сообщение без подходящей подписки отбрасывается, если оно не сохраняемое

Тема - строка из уровней, разделённых /. Подписка называет фильтр темы, и в нём могут быть подстановочные знаки. + заменяет ровно один уровень. # заменяет остаток темы, включая родительский уровень, и стоит последним. Публикация всегда называет полную тему: публикацию в тему с подстановочным знаком этот крейт отклоняет до того, как что-либо отправлено.

Тему, которая начинается с $, например собственные темы сервера $SYS/..., никогда не выбирает фильтр, который начинается с подстановочного знака. Сервис читает такие темы, только если называет их первый уровень.

Сервер отправляет сообщение каждой подписке, которая к нему подходит. Если на одном соединении есть два фильтра и подходят оба, MQTT 5 разрешает серверу отправить по пакету протокола на каждую подписку, и в каждом пакете указан идентификатор этой подписки. Mosquitto так и поступает, а этот крейт различает копии по этому идентификатору, как показывает страница Демультиплексирование.

Группа совместной подписки делит работу. Фильтр $share/workers/devices/+/telemetry подписывается на devices/+/telemetry в группе workers, и сервер отдаёт каждое сообщение одной сессии группы. Подписка вне группы всё равно получает собственную копию.

Публикация с флагом retain остаётся в своей теме. Сервер хранит последнее сохранённое сообщение каждой темы и отправляет его каждой новой подписке, фильтр которой подходит, кроме группы совместной подписки. Сохраняемая публикация с пустой полезной нагрузкой очищает тему.

Сервер хранит только сохранённое сообщение каждой темы и неподтверждённые сообщения постоянной сессии, о которых рассказывает страница Сессии. Если к сообщению в момент прихода не подходит ни одна подписка и оно не сохраняемое, сообщение пропадает.

Заголовки сообщения передаются как свойства MQTT 5. Пользовательское свойство - пара строк UTF-8, а тип содержимого, тема ответа и данные корреляции - отдельные свойства. Этот крейт отображает заголовки на них, как показывает страница Заголовки. Строка MQTT не может содержать U+0000, а на другие управляющие символы сервер может ответить закрытием соединения, поэтому крейт отклоняет заголовок или тему с таким символом.

Модель принадлежит самому протоколу и взята из стандарта MQTT 5.0: имена и фильтры тем - раздел 4.7, совместные подписки - 4.8.2, сохранённые сообщения - 3.3.1.3. Как подтверждается доставка, рассказывает страница Качество обслуживания.