Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Темы
Сервер MQTT доставляет сообщение каждой подписке, фильтр которой подходит к его теме, одному участнику группы совместной подписки и хранит сохранённые сообщения.
Схема текстом
- Группа workers: devices/+/telemetry участник 1 получает; devices/+/telemetry участник 2 нет
- Издатель отправляет в тему devices/dev42/telemetry → Сервер MQTT сверяет тему с фильтром каждой подписки: PUBLISH
- Сервер MQTT сверяет тему с фильтром каждой подписки → devices/dev42/telemetry та же тема
- Сервер MQTT сверяет тему с фильтром каждой подписки → devices/+/telemetry + - один уровень
- Сервер MQTT сверяет тему с фильтром каждой подписки → devices/# # - остаток
- Сервер MQTT сверяет тему с фильтром каждой подписки → devices/+/telemetry участник 1 получает
- Сервер MQTT сверяет тему с фильтром каждой подписки → Сохранённое сообщение последнее в теме: с флагом retain
- Сохранённое сообщение последнее в теме → Подписка, что появится позже
- devices/+/state не подходит
- Сообщение без подходящей подписки отбрасывается, если оно не сохраняемое
Тема - строка из уровней, разделённых /. Подписка называет фильтр темы, и в нём могут быть
подстановочные знаки. + заменяет ровно один уровень. # заменяет остаток темы, включая
родительский уровень, и стоит последним. Публикация всегда называет полную тему: публикацию в тему
с подстановочным знаком этот крейт отклоняет до того, как что-либо отправлено.
Тему, которая начинается с $, например собственные темы сервера $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. Как подтверждается доставка, рассказывает страница Качество обслуживания.