MQTT: cos’è e come funziona il “QoS” (Quality of Service)

3 minuti di lettura

Logo MQTT

Il cosiddetto Quality of Service (in breve QoS) è tra le funzionalità più importanti del protocollo MQTT. La qualità del servizio a cui si fa riferimento è intesa come il grado di accuratezza nella consegna dei messaggi MQTT tra i mittenti e il broker e il broker e i sottoscrittori, ovvero l’accuratezza che definisce la garanzia dell’effettiva, avvenuta consegna di tali messaggi.

Esistono tre livelli di servizio QoS:

  • Al massimo una volta (livello 0)
  • Almeno una volta (livello 1)
  • Esattamente una volta (livello 2)

Il QoS MQTT riguarda sostanzialmente le due fasi della consegna di un messaggio inviato da un client mittente e riceuto da un client sottoscrittore:

  • l’invio dal mittente al broker;
  • l’invio dal broker a destinatario finale.

Nella prima fase il mittente decide il livello di QoS associato al messaggio e lo invia al broker; nella seconda, il broker a sua volta gira tale messaggio a tutti i client che abbiano una sottoscrizione per tale messaggio utilizzando il medesimo livello QoS, a meno che i client sottoscrittori non abbiano provveduto all’iscrizione indicando un livello QoS inferiore. In tal caso, il broker girerà il messaggio con un livello QoS inferiore.

QoS è molto importante perché concede al mittente la possibilità di scegliere il livello di servizio in base alla qualità della rete e alla logica applicativa. A seguire vediamo le varie differenze.

QoS 0

Il livello minimo per QoS è zero. Si tratta di un livello concepito per le massime prestazioni col minor sforzo: in questo scenario non c’è alcuna garanzia di consegna. Il mittente invia al broker e si dimentica della cosa, non attende alcuna risposta né provvede a un eventuale re-invio. Per dirla semplice, come va, va.

QoS 1

In questo scenario il mittente (che sia quello che invia l’iniziale messaggio al broker, o esso sia il broker stesso che gira un messaggio al ricevente finale) mantiene in memoria il messaggio finché non riceve dal destinatario l’ok di avvenuta ricezione. In caso non lo riceva entro un tempo congruo, lo invia nuovamente, una seconda volta, e attende nuovamente risposta, e così via. Usando QoS 1 potrebbero dunque verificarsi consegne molteplici del medesimo messaggio. Quando infatti il broker riceve un messaggio marchiato con QoS 1 provvede subito a girarlo ai sottoscrittori di tale messaggio e poi risponde “fatto” al mittente; se il tempo tra l’invio e la ricezione del pacchetto di conferma è troppo lunga (per esempio in reti congestionate), il mittente invia nuovamente il messaggio, scatenando nuovamente tutta la catena e causando un invio duplicato.

QoS 2

Questa è la modalità più lenta ma anche più affidabile: in sostanza il processo prevede un doppio rimbalzo tra mittente e destinatario al fine di confermare al mittente l’effettiva presa in carico del messaggio e quindi l’annullamento di un eventuale re-invio. Questo garantisce che il messaggio arrivi esattamente una e una sola volta, ma ovviamente è più oneroso (minimamente) per i sistemi, per la rete e per i timing.

Qual è il migliore?
Non c’è ovviamente una risposta unica. Dipende, come spesso accade, dallo scenario di applicazione del protocollo MQTT, il quale è concepito sì per comunicazioni leggere e rapide, ma la sua configurazione in termini di QoS va calibrata con attenzione in base all’ambito di utilizzo.

Si consiglia QoS 0 quando:

  • la connessione di rete tra i client e il broker è affidabile, veloce e stabile. Banalmente, quando si utilizza una connessione via cavo;
  • non è un problema se qualche messaggio va perduto;
  • non è necessario utilizzare l’accodamento dei messaggi e le sessioni persistenti.

Si consiglia QoS 1 quando:

  • la connessione di rete può, talvolta, esser instabile, come nel caso del Wi-Fi domestico;
  • non è un problema ricevere eventualmente messaggi duplicati;
  • non è possibile sostenere il sovraccarico dato dal QoS 2.

Si consiglia infine il QoS 2 quando è critico il fatto di garantire sempre una e un’unica consegna per ogni singolo messaggio.

Nella domotica personale – lo avrete forse già capito da soli – il QoS consigliabile è l’1, in quanto solitamente la ricezione (comunque rarissima) di messaggi duplicati non causa, solitamente, problemi di sorta. Immaginiamo un topic come il seguente:

cmnd/Tasmota/POWER 1

il quale, solitamente, comanda un attuatore dotato di firmware Tasmota di spegnere il relè. Sarebbe forse un problema se l’attuatore ricevesse in sequenza lo stesso messaggio due volte? Di certo no. Lo sarebbe invece il fatto di non riceverlo, cosa che potrebbe capitare in caso di uso di QoS 0.

Esistono ovviamente eccezioni: per esempio, nel caso di un sistema d’allarme MQTT è suggeribile d’adozione del QoS 2, in quanto è immaginabile che sia più appropriato ricevere comandi univoci e certi, sempre.

Come configurare MQTT sui dispositivi della propria domotica