Не удалось опубликовать доставку в QoS1 MQTT

Я использую брокер moqette mqtt и пытаюсь понять реализацию, а также брокера MQTT. Я надеюсь внести некоторые изменения в брокера для личного проекта.

Мне любопытно, что должно произойти, когда устройство отправляет сообщение PUBLISH в брокер, а брокер не может доставить сообщение подписчикам. Протокол гласит, что PUBACK отправляется обратно издателю. В исходном коде moquette этот PUBACK, похоже, отправляется после пересылки сообщения любым подписчикам.

Я закомментировал функцию sendPubAck(), чтобы имитировать, что сообщение не было успешно опубликовано, поэтому я предположил, что издатель опубликует сообщение снова. Однако, когда я добавляю оператор печати рядом с функцией обработчика входящих сообщений, я вижу только сообщения PINGREQ, которые периодически отправляются от издателя к посреднику. Я не вижу опубликованных сообщений.

Мой вопрос заключается в следующем: как именно клиентское устройство решает, когда повторно публиковать сообщение? Потому что комментирование функции sendPubAck() не заставляет издателя переслать сообщение.

1 ответ

Решение

Есть два варианта. Во-первых, вы можете добавить параметр тайм-аута сообщения для повторной отправки вашего PUBLISH, если PUBACK не получен. Во-вторых, вы можете отправить свою ПУБЛИКУ только при переподключении.

Я считаю, что второй вариант является лучшим вариантом. Причина этого кроется в возможных причинах, по которым брокер (или клиент, конечно, в зависимости от направления общения) не ответил.

  1. Вы могли бы иметь брокера с ошибками, который фактически является тем, что вы создали
  2. Возможно, произошел сбой сети (соединение потеряно, но не обнаружено),
  3. Брокер может быть перегружен.

В первом случае мы ничего не можем сделать, кроме как исправить брокера. Во втором случае клиент должен повторить публикацию при повторном подключении. В третьем случае отправка дубликата PUBLISH не поможет брокеру ответить, а только перегрузит его.

Стоит отметить, что брокер не должен ждать ответа подписавшихся клиентов перед отправкой PUBACK на клиент публикации.

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