Menu

Livelli QoS (Capitolo 3 MQTT)

27 Luglio 2021
Nessun Commento
Livelli Qos

La qualità del servizio MQTT

La possibilità di inviare messaggi che vengono gestiti in modi diversi è uno dei fattori che distinguono l’MQTT dagli altri protocolli di comunicazione. Questo servizio è chiamato QoS (Quality of Service) nell’MQTT. Questo articolo esaminerà in modo approfondito cosa sono i livelli QoS e come migliorano la comunicazione di rete. Descriveremo inoltre alcune migliori pratiche per determinare quale dei tre livelli di QoS utilizzare quando si inviano messaggi tra editori, broker e client.

Cos’è la QoS?

La QoS (Quality of Service) è un attributo che viene assegnato a un singolo messaggio quando viene pubblicato. La QoS è essenzialmente un accordo tra mittente e destinatario che definisce il modo in cui un messaggio viene consegnato. Consente ai client di selezionare un livello di servizio che tenga conto dell’affidabilità della rete e della logica di programmazione. L’MQTT è in grado di ritrasmettere messaggi e garantire la consegna, quindi l’aggiunta della QoS facilita la comunicazione utilizzando reti inaffidabili.

La QoS definisce fino a che punto il broker o il client si spingerà per garantire la ricezione di un messaggio. Il livello QoS iniziale è impostato dal client che pubblica il messaggio prima che venga inviato al broker. Il livello QoS può essere declassato dai sottoscritti ai messaggi. I broker consegnano messaggi in base alla QoS definita dal sottoscritto, non dall’editore.

Ecco una panoramica dei tre livelli di QoS nell’MQTT.

QoS 0

Quando la QoS è impostata su 0, un messaggio viene recapitato al massimo una volta. Potrebbe non venire consegnato affatto. Non c’è conferma della consegna con questo livello di QoS. Il messaggio non viene archiviato e può essere perso se il client si disconnette o il server non funziona.

Questo livello di QoS viene talvolta definito “fire and forget” ed è la modalità di trasferimento dati più veloce in un’implementazione MQTT. I messaggi su QoS 0 non devono essere inoltrati a un client. Un messaggio può essere eliminato dal server se il client previsto viene disconnesso quando il server riceve la pubblicazione.

QoS 1

QoS 1 è la modalità di trasferimento predefinita dell’MQTT e indica che il messaggio viene sempre consegnato almeno una volta. La ricezione del messaggio deve essere confermata. La mancata ricezione di un riconoscimento comporta il reinvio del messaggio con il flag DUP impostato. Questo processo si ripete fino a quando il messaggio viene riconosciuto e può portare all’invio e all’elaborazione dello stesso messaggio più volte.

I messaggi impostati su QoS 1 vengono archiviati localmente presso il mittente e il destinatario fino a quando non vengono elaborati. Un destinatario elimina il messaggio dopo averlo elaborato. Quando il destinatario è un broker, il messaggio viene pubblicato ai sottoscritti appropriati. I client che ricevono un messaggio lo consegnano all’applicazione di sottoscrizione. Alla cancellazione del messaggio, il destinatario invia una conferma al mittente. I mittenti eliminano un messaggio a QoS 1 dopo aver accettato la conferma dal destinatario.

QoS 2

I messaggi inviati a QoS 2 vengono sempre consegnati esattamente una volta. È la modalità di trasferimento più affidabile e lenta in una rete MQTT. I messaggi vengono archiviati localmente presso il mittente e il destinatario finché non vengono elaborati. Tra il mittente e il destinatario vengono eseguite almeno due coppie di trasmissioni prima che un messaggio venga eliminato dal mittente. Il messaggio può essere elaborato dal destinatario dopo che la prima o la seconda trasmissione è stata completata, purché non lo elabori più di una volta.

La prima coppia di trasmissioni comprende il mittente che invia il messaggio e ottiene la conferma che il destinatario lo ha memorizzato. Se il mittente non riceve la conferma, i messaggi vengono ritrasmessi con il flag UDP impostato fino a quando non viene ricevuto un riconoscimento. Nella seconda coppia di trasmissioni, il mittente informa il destinatario che può completare l’elaborazione del messaggio inviando un messaggio PUBREL. Il messaggio PUBREL verrà inviato ripetutamente fino a quando non ne viene confermata la ricezione, a quel punto il mittente cancella il messaggio.

Quando il destinatario del messaggio è un broker, svolge la sua funzione e pubblica il messaggio agli subscribers. Un destinatario client consegna il messaggio all’applicazione di sottoscrizione. Quando il destinatario ha terminato l’elaborazione di un messaggio, invia un messaggio di completamento al mittente. Il livello QoS 2 viene utilizzato per garantire che i messaggi non vengano persi o elaborati più di una volta.

QoS in azione

QoS 0 fornisce la consegna best-effort senza alcuna garanzia di successo. Non c’è conferma della ricezione dei messaggi e non vengono archiviati o ritrasmessi in caso di errore.

QoS 1 garantisce che un messaggio venga recapitato con successo al destinatario almeno una volta. Un mittente memorizza un messaggio fino a quando il destinatario non conferma la ricezione restituendo un pacchetto PUBACK. L’identificatore del pacchetto PUBLISH viene utilizzato nella creazione del pacchetto PUBACK. Il pacchetto PUBLISH viene reinviato se il mittente non riceve il pacchetto PUBACK in un lasso di tempo ragionevole.

È necessario il processo four way handshake per completare l’elaborazione dei messaggi inviati a livello QoS 2. L’identificatore del pacchetto del messaggio PUBLISH originale viene utilizzato per coordinare la consegna. Il flusso dei messaggi è conforme al modello seguente.

Un destinatario riceve un pacchetto PUBLISH da un mittente e risponde con un pacchetto PUBREC che conferma la ricezione del pacchetto originale. L’assenza di un pacchetto PUBREC fa sì che il messaggio venga rinviato con un flag DUP. Quando viene ricevuto il pacchetto PUBREC, il mittente può eliminare il pacchetto PUBLISH iniziale. Il mittente, quindi, memorizza il pacchetto PUBREC e risponde con un pacchetto PUBREL. Alla ricezione del pacchetto PUBREL, il destinatario scarta tutti gli stati memorizzati e risponde con un PUBCOMP al mittente. Il ricevitore memorizza un riferimento al pacchetto identificato nel messaggio PUBLISH originale fino all’invio del pacchetto PUBCOMP, per evitare di elaborare il messaggio una seconda volta.

Le pratiche migliori per la scelta di un livello di QoS

Il vantaggio di avere più livelli QoS è che possono essere utilizzati per affrontare diverse situazioni o requisiti. Di seguito sono riportate alcune linee guida su quando utilizzare ciascun livello di qualità del servizio (QoS).

  • Il livello QoS 0 può essere utilizzato quando esiste una connessione affidabile e stabile tra il mittente e il destinatario, ad esempio su una rete cablata. Il sistema deve essere in grado di tollerare messaggi persi occasionali. Non ci sono messaggi in coda con questo livello di QoS.
  • QoS 1 dovrebbe essere usato quando ogni messaggio deve passare e i duplicati possono essere gestiti dai destinatari. Questo è il livello di servizio più comunemente utilizzato poiché la consegna dei messaggi è garantita ed è più veloce del livello QoS 2.
  • Infine, QoS 2 viene utilizzato quando un’applicazione deve assicurarsi di ricevere un messaggio solo una volta. Il sovraccarico di questo livello di servizio deve essere considerato quando viene selezionato, poiché l’elaborazione dei messaggi sarà più lenta rispetto ai livelli inferiori.

La disponibilità di diversi livelli QoS consente di ottimizzare i sistemi in base ai requisiti delle applicazioni sottostanti e all’affidabilità della rete. Essere in grado di selezionare la modalità di consegna dei messaggi è una delle caratteristiche più interessanti del protocollo MQTT e lo rende una scelta eccellente per le implementazioni IoT e di automazione industriale.

Torna su