In questo capitolo tratteremo il Last Will and Testament, ovvero la gestione dello stato dei componenti in caso di disconnessioni improvvise.
L’MQTT è stato progettato per facilitare la comunicazione tra dispositivi su reti inaffidabili. Una delle caratteristiche che contribuiscono a considerare inaffidabile una rete è che i client o i dispositivi possono improvvisamente e inspiegabilmente disconnettersi. Nelle grandi applicazioni IoT o di automazione industriale dove ci sono molti dispositivi interconnessi, il malfunzionamento di un dispositivo critico può avere un impatto negativo sull’intero sistema.
I client in una rete MQTT possono disconnettersi in modo corretto o in modo imprevisto. Una disconnessione corretta è prevista e fatta per un motivo specifico, il client genererà un messaggio MQTT DISCONNECT, che fornisce informazioni che permettono al sistema di rispondere in modo appropriato. In un’implementazione robusta, il sistema continuerà a funzionare nonostante il client disconnesso.
Nel caso di una disconnessione non regolare o inaspettata, la funzione Last Will and Testament (LWT) di MQTT informa gli altri client dell’evento in modo che possano intraprendere azioni adeguate. I messaggi LWT sono consegnati solo dopo una disconnessione non graduale e sono cancellati una volta che un client si disconnette in modo graduale. L’inclusione di un messaggio Last Will and Testament assicura che un messaggio finale sia ascoltato da un client, a prescindere da come si disconnette.
Cos’è il Last Will and Testament dell’MQTT?
Lo scopo di un messaggio LWT è quello di specificare le azioni da intraprendere dopo che un client va offline inaspettatamente. Le informazioni sull’ultima volontà (Last Will) sono contenute in un normale messaggio MQTT che contiene un argomento, un flag di messaggio trattenuto, il livello di qualità del servizio e un payload di dati. Queste informazioni sono utilizzate solo nel caso di una disconnessione non graduale.
Il messaggio LWT viene consegnato al broker quando il client genera un messaggio CONNECT per contattare il broker. Il broker memorizza il messaggio LWT finché non è necessario per affrontare una disconnessione inaspettata. I messaggi LWT per un client sono scartati dal broker non appena un client genera il messaggio DISCONNECT che indica una “graceful” exit (disconnessione corretta). Poiché il client si è disconnesso normalmente, non c’è bisogno che il messaggio LWT sia consegnato.
Se il broker rileva che un client si è disconnesso senza preavviso, il messaggio LWT viene inviato a tutti i client che hanno sottoscritto l’ultimo argomento del messaggio di volontà (Last Will). Ci sono diversi scenari in cui il broker invia il messaggio LWT ai client sottoscritti.
- Quando il broker rileva un guasto di rete o un errore I/O;
- Il broker deve chiudere la connessione di rete per risolvere un errore di protocollo;
- Il client chiude la connessione di rete senza inviare un messaggio DISCONNECT;
- Il client non comunica con il broker entro il periodo Keep Alive.
Se una qualsiasi di queste condizioni è soddisfatta, il messaggio LWT per il dato client viene inviato a tutti i sottoscritti in modo che possano affrontare la situazione. La capacità di inviare messaggi LWT può essere un fattore critico nel mantenimento della funzionalità di una rete MQTT.
Utilizzare LWT
Un messaggio LWT è essenzialmente un messaggio finale consegnato da un broker per conto di un client che non può più inviare messaggi da solo. Le informazioni contenute nel messaggio possono essere utilizzate per avviare procedure di recupero nel caso in cui un client importante venga disconnesso. Insieme ai messaggi trattenuti, un messaggio LWT mantiene gli altri client aggiornati sullo stato di un client specifico riguardo a un argomento di interesse.
Un semplice esempio aiuta a chiarire l’interazione del messaggio LWT con i suoi client associati. Un client si è connesso al broker e ha richiesto la consegna di un messaggio LWT che informa tutti i sottoscrittori che ora è offline. In circostanze normali, il client invia un messaggio “online” ai sottoscrittori dell’argomento. Questi ultimi vengono avvisati di un cambiamento di stato o da un messaggio “graceful” DISCONNECT ricevuto dal broker e diffuso ai sottoscrittori o dal messaggio LWT nei casi in cui la connessione termina in modo anomalo.
In base al modo in cui il sistema è configurato, un messaggio LWT può essere catturato da un sistema di monitoraggio che determina la natura dell’interruzione e se è necessario può generare ulteriori avvisi. Il messaggio LWT può anche essere usato per modificare la configurazione del sistema in modo che la funzionalità possa essere mantenuta nonostante l’assenza di un particolare client. L’uso dei messaggi LWT protegge efficacemente la rete da guasti improvvisi dei componenti, notificando gli abbonati interessati quando si verifica un guasto.