Сохранен ли порядок сообщений в сообщениях MQTT?
Интересно, сохранилось ли сообщение отправленного заказа. То есть, когда издатель отправляет последовательность сообщений, гарантированно ли каждый подписчик получает ту же последовательность, что и отправитель? Для чистых и постоянных сессий?
2 ответа
Краткое описание возможностей упорядочения сообщений в MQTT 3.1.1 можно найти в самой спецификации здесь.
В итоге:
- нет никаких гарантий относительно относительного порядка сообщений, публикуемых с различными значениями QoS. (например, QoS 0 может взять, например, QoS 2, так как он включает в себя один пакет, а не 4 пакета последнего).
- Сообщения QoS 0 будут доставлены в порядке (хотя сообщения могут быть потеряны)
- QoS 2 сообщения будут доставлены в порядке
- QoS 1 допускает дублирование сообщений - возможно, дубликаты появятся после первого экземпляра следующего опубликованного сообщения.
Порядок QoS 1 может быть гарантирован, если клиент / брокер допускает только одно сообщение в любой момент времени.
когда издатель отправляет последовательность сообщений, гарантированно ли каждый подписчик получит ту же последовательность, что и издатель?
Я знаю, что на этот вопрос был дан ответ и он хорошо принят, но я вижу проблему со следующим утверждением в принятом ответе .
Сообщения QoS 2 будут доставлены по порядку
Согласно документации , указана последовательность пакетов.
PUBLISH
,
PUBACK
,
PUBREC
а также
PUBREL
будет поддерживаться для каждой темы в сообщениях того же уровня QOS. Однако подписчик по-прежнему может получать в порядке, отличном от опубликованного издателем (возможно, но редко).
Посмотрим, как:
- Пакет PUBLISH был отправлен брокером для сообщения m1.
- Пакет PUBLISH был отправлен брокером для сообщения m2.
- Пакет PUBACK был отправлен подписчиком на сообщение m1.
- Пакет PUBACK был отправлен абонентом для сообщения m2.
- Пакет PUBREC был отправлен брокером для сообщения m1. Но это упало.
- Пакет PUBREC был отправлен брокером для сообщения m2.
- Пакет PUBREL был отправлен абонентом для сообщения m2.
- Истекло время ожидания пакета PUBREL на брокере для сообщения m1. Брокер попытается отправить сообщение m1.
При указанной выше последовательности существует вероятность того, что сообщение m2 будет обработано первым в получателе. Однако m1 был опубликован раньше m2.
См. Этот ответ для получения дополнительных сведений.