2016-12-26 24 views
0

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

  1. ClientA-> Сервер публиковать пачке
  2. Сервер -> Clientâ pubrecv пакет

Когда сервер RECV пакета публикации, сохранить в БД, то сервер публиковать другим клиентам, например. ClientB. Даже если мы представим два одинаковых пакета публикации из ClientA, сервер проверит db и узнает, что это повторяющееся сообщение, поэтому не публиковать в ClientB.

Так что я не думаю, что нужно 4 пакета.

Правильно ли моя логика?

+0

Я предполагаю, что это использует 4 пакетов чтобы избежать отправки отправителем первоначального пакета, а не только для того, чтобы не обрабатывать его в приемнике. – Hicaro

ответ

4

В протоколе используются два обмена пакетами, чтобы обеспечить однозначную семантику обмена сообщениями QoS 2.

C --- PUBLISH --> S 
*1 
C <-- PUBREC --- S 
*2 
C --- PUBREL --> S 
*3 
C <-- PUBCOMP --- S 
*4 

Когда сервер получает PUBLISH он хранит идентификатор и передает сообщение о. Когда сервер получает PUBREL, он может удалить идентификатор.

Если соединение нарушается на *1, клиент не знает, получил ли сервер сообщение. Он отправляет PUBLISH (содержащий полную полезную нагрузку сообщения). Если сервер уже получил сообщение, ему просто нужно ответить PUBREC.

Если соединение разрывается на *2, клиент может получить или не получить PUBREC. Если это не так, оно отправит PUBLISH. В противном случае он отправит PUBREL.

Если соединение нарушается на *3, клиент не знает, получил ли сервер сообщение. Он отправляет PUBREL - который не содержит полной полезной нагрузки сообщения.

Если соединение не работает *4, и клиент не получил PUBCOMP, он может отправить PUBREL.

Есть два наблюдения для почему необходимы два обменов:

  1. сервер не требуется, чтобы помнить каждое сообщение, что когда-либо видел. Для хранения идентификатора сообщения существует очень четко определенный период. Обе биржи позволяют обеим сторонам быть уверенными, что сообщение доставлено ровно один раз.
  2. клиент не нужно повторно отправить ПУБЛИКОВАТЬ несколько раз (если соединение не прерывается при *1. Учитывая протокол предназначен для минимизации сетевого трафика, это важная особенность.
+0

Я получил его. MQTT определяет не использовать базу данных, все данные хранятся в памяти, поэтому для использования данных требуется 4 пакета хранить сообщение, может использовать 2 пакета. – user501836

+0

Использование базы данных или нет. Ваша схема предполагает, что брокер должен хранить все сообщения навсегда, чтобы избежать дублирования. Это не масштабируется и не является практичным. – knolleary

+0

Поскольку я хочу создать свою службу мгновенных сообщений с помощью MQTT, так что вам нужно сохранить все сообщения. MQTT очень полезен. – user501836