Сохранен ли порядок сообщений в сообщениях 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. Однако подписчик по-прежнему может получать в порядке, отличном от опубликованного издателем (возможно, но редко).

Посмотрим, как:

  1. Пакет PUBLISH был отправлен брокером для сообщения m1.
  2. Пакет PUBLISH был отправлен брокером для сообщения m2.
  3. Пакет PUBACK был отправлен подписчиком на сообщение m1.
  4. Пакет PUBACK был отправлен абонентом для сообщения m2.
  5. Пакет PUBREC был отправлен брокером для сообщения m1. Но это упало.
  6. Пакет PUBREC был отправлен брокером для сообщения m2.
  7. Пакет PUBREL был отправлен абонентом для сообщения m2.
  8. Истекло время ожидания пакета PUBREL на брокере для сообщения m1. Брокер попытается отправить сообщение m1.

При указанной выше последовательности существует вероятность того, что сообщение m2 будет обработано первым в получателе. Однако m1 был опубликован раньше m2.

См. Этот ответ для получения дополнительных сведений.

Другие вопросы по тегам