Не удалось опубликовать доставку в QoS1 MQTT
Я использую брокер moqette mqtt и пытаюсь понять реализацию, а также брокера MQTT. Я надеюсь внести некоторые изменения в брокера для личного проекта.
Мне любопытно, что должно произойти, когда устройство отправляет сообщение PUBLISH в брокер, а брокер не может доставить сообщение подписчикам. Протокол гласит, что PUBACK отправляется обратно издателю. В исходном коде moquette этот PUBACK, похоже, отправляется после пересылки сообщения любым подписчикам.
Я закомментировал функцию sendPubAck(), чтобы имитировать, что сообщение не было успешно опубликовано, поэтому я предположил, что издатель опубликует сообщение снова. Однако, когда я добавляю оператор печати рядом с функцией обработчика входящих сообщений, я вижу только сообщения PINGREQ, которые периодически отправляются от издателя к посреднику. Я не вижу опубликованных сообщений.
Мой вопрос заключается в следующем: как именно клиентское устройство решает, когда повторно публиковать сообщение? Потому что комментирование функции sendPubAck() не заставляет издателя переслать сообщение.
1 ответ
Есть два варианта. Во-первых, вы можете добавить параметр тайм-аута сообщения для повторной отправки вашего PUBLISH, если PUBACK не получен. Во-вторых, вы можете отправить свою ПУБЛИКУ только при переподключении.
Я считаю, что второй вариант является лучшим вариантом. Причина этого кроется в возможных причинах, по которым брокер (или клиент, конечно, в зависимости от направления общения) не ответил.
- Вы могли бы иметь брокера с ошибками, который фактически является тем, что вы создали
- Возможно, произошел сбой сети (соединение потеряно, но не обнаружено),
- Брокер может быть перегружен.
В первом случае мы ничего не можем сделать, кроме как исправить брокера. Во втором случае клиент должен повторить публикацию при повторном подключении. В третьем случае отправка дубликата PUBLISH не поможет брокеру ответить, а только перегрузит его.
Стоит отметить, что брокер не должен ждать ответа подписавшихся клиентов перед отправкой PUBACK на клиент публикации.