In MQTT protocol, with QoS (Quality of Service) we define an agreement between the client and the broker about the message delivery level. This level is defined at two point. When the client is Subscribed to a topic (path) and when the client is publish a message.
There are 3 levels of QoS:
- level 0: The message published one time only
- level 1: The message published, received at least one time
- level 2: The message received only one time
Level 0 messages are “best effort” or “fire and forget” deliveries. There is no guarantee of delivery. Use Level 0 when there is a stable connection between the clients and the broker or you don’t mind if some of the messages are lost.
Level 1 messages guaranteed the the receipt has got the message at least one time. Use this type of QoS level if you want to make sure the messages are delivered and you can handle even duplicated messages at application level.
Level 2 messages are the highest QoS messages. This level guaranteed that the message is received and only received one time. Use this kind of QoS level when you want to make sure that the messages are always received and only received one time.
At level 1 and level 2 the messages are queuing between the broker and the client. The higher the service level it takes more network traffic and time to make sure the message is received.
At the full message path between two client we need to metion the possibility of QoS downgrade. When a client publish a message with higher QoS level (1 or 2) this QoS level only determine the communication between the client and the broker itself. When the other client subscribed to the same path describes a lower QoS level (0 or 1) the Broker will send the message to the client by the defined subscription QoS level.
MQTT QoS level are not equal to the TCP/IP gauranteed delivery mechanism. TCP/IP guarantee delivery at network layer, while MQTT QoS level quarantee message delivery at application layer.