lunedì 11 marzo 2019

Il QoS di MQTT


Il QoS nei messaggi MQTT merita di essere approfondito, specie perchè nel futuro ci servirà non poco!


QoS, acronimo di Quality of Service viene usato molto spesso in fase di configurazione dei router. Questo trucchetto serve a decidere quale traffico ha priorità, per esempio un gamer darà priorità alta ai giochi e bassa alle chiamate Skype e via dicendo.




Per i messaggi MQTT la cosa è similare, solo che esistono solo 3 livelli di QoS per garantire la consegna dei messaggi :

0 = al massimo una volta
1 = almeno una volta
2 = esattamente una volta

Sappiamo che l'architettura MQTT prevede che i client mandino un messaggio al broker e che il broker mandi il messaggio ricevuto a tutti i client.
Solo che i client, nel momento che si iscrivono ad un topic, possono scegliere con quale livello di QoS iscriversi.

Quindi potrebbe succedere che venga generato un messaggio con un QoS pari a 2 ma che alcuni subscriber lo ricevano con un QoS pari a 0.



Questo è stato implementato perchè sono moltissimi i dispositivi che usano MQTT e non tutti hanno una connessione di rete perfetta o un'architettura in grado di gestire magari tutti e tre i livelli di QoS. 

Vediamo nel dettaglio i tre livelli in modo da capire meglio :

Livello 0
Viene inviato un pacchetto e si spera che il broker lo abbia ricevuto.
Non viene erogata nessuna conferma di nessun tipo, nè il messaggio viene inviato una seconda volta.
Se c'è una connessione stabile (con magari un access point che ha solo i sensori collegati), se non è poi molto importante il dato perchpè si sa che nel prossimo minuto verrà trasmesso un dato aggiornato, il livello 0 è più che accettabile.
Anche se la banda disponibile è poca è consigliabile usare questo QoS.

Livello 1
Viene inviato un pacchetto e si attende che il broker mandi il messaggio di avvenuta ricezione. 
Si può anche fare in modo che venga mandato un messaggio ogni tot fino a che il broker non conferma la ricezione.
Il broker, prima di confermare la ricezione gira il messaggio a tutti i subscriber.
Dato questo QoS non è detto che non venga mandato per due volte lo stesso messaggio.
Se il dato è mediamente importante oppure il sensore viene attivato con bassa frequenza, sempre che ci sia abbastanza banda che permette l'invio di messaggi multipli, questo è il QoS che fa per voi.

Livello 2
Viene inviato un pacchetto e si attende che il broker mandi il messaggio a tutti i subscriber, poi invia a chi lo ha generato il messaggio di avvenuta ricezione. 
Senza tale messaggio viene inviato un secondo pacchetto con un'identificazione apposita e si attende come sopra.
Quando il broker manda il messaggio di conferma la ricezione, chi ha generato il messaggio risponde ancora e chiude il ciclo di controllo.
In questo modo entrambe le parti sanno che un pacchetto è stato generato ed è stato sia ricevuto che , ovviamente, girato a tutti i subscriber.
Se il dato è importante e tutti lo devono ricevere almeno una volta, fregandovene della saturazione della rete, usate il QoS 2.

Il problema si pone, quindi, da parte del broker nei confronti di chi ha sottoscritto il topic con il livello 0. Infatti, non si avrà mai la certezza che i subscriber con quel QoS abbiamo ricevuto il dato. Solo per i livelli 1 e 2 il dato viene tenuto disponibile per tutti i subscriber che per qualche ragione sono offline, aspettando che tornino disponibili.



Fonti :

HiveMQ - MQTT Essentials Part 6: Quality of Service 0, 1 & 2
Steve's Internet Guide - Understanding MQTT QOS Levels
AssetWolf - Quality of Service (QoS)
Mosquitto.org - Quality of Service


Nessun commento:

Posta un commento

Sei davvero sicuro di voler sprecare tempo prezioso per scrivere qualcosa? Non è che preferisci andare su Google?

Cerca nel blog

I post più letti di sempre