Was ist MQTT Quality of Service (QoS) 0, 1 und 2? – MQTT Essentials: Teil 6
MQTT Quality of Service (QoS) definiert die Zustellgarantie für Nachrichten zwischen dem Sender (Publisher) und dem Empfänger (Broker oder Subscriber). Es ist eine zentrale Funktion, die es MQTT ermöglicht, zuverlässig in unterschiedlichen Netzwerkbedingungen zu arbeiten, wobei Zuverlässigkeit und Effizienz ausgewogen bleiben.
In Teil 6 der MQTT Essentials-Serie werfen wir einen genaueren Blick auf die verschiedenen QoS-Stufen in MQTT. Wenn Sie mehr über MQTT-Themen, Wildcards und Best Practices wissen möchten, lesen Sie Teil 5 der Serie.
Bedeutung von QoS in MQTT-Nachrichtenübertragung
Der Begriff „Quality of Service“ beschreibt die Vereinbarung zwischen Sender und Empfänger, wie Nachrichten übermittelt und bestätigt werden. In IoT-Umgebungen mit instabiler Verbindung bietet QoS zuverlässige Mechanismen, um sicherzustellen, dass wichtige Nachrichten korrekt und je nach Bedarf mehrfach oder genau einmal zugestellt werden.
Unterschiede zwischen QoS 0, 1 und 2
Das Quality of Service-Framework von MQTT bietet drei unterschiedliche Zuverlässigkeitsstufen, die auf verschiedene IoT-Anwendungsfälle zugeschnitten sind – je nachdem, welches Maß an Zuverlässigkeit im jeweiligen Szenario erforderlich ist.
QoS 0 – Höchstens einmal:
„Fire and forget“ – Nachrichten werden ohne Bestätigung vom Empfänger gesendet. Es gibt keine Garantie, dass die Nachricht ankommt.
QoS 1 – Mindestens einmal:
Nachrichten werden mindestens einmal zugestellt. Der Empfänger sendet eine PUBACK-Bestätigung zurück. Wiederholte Zustellungen sind möglich.
QoS 2 – Genau einmal:
Höchste Garantie. Nachrichten werden exakt einmal zugestellt durch einen 4-Schritte-Handshake: PUBLISH, PUBREC, PUBREL, PUBCOMP.
Diese Staffelung erlaubt bewusste Entscheidungen zwischen Zustellsicherheit, Bandbreitennutzung und Systemressourcen.
Dieser gestufte Ansatz ermöglicht es Entwicklern, gezielte Abwägungen zwischen Zustellgarantie, Bandbreitennutzung und Verarbeitungsaufwand zu treffen. Durch die Wahl der passenden QoS-Stufe für jeden Nachrichtentyp können IoT-Anwendungen ihre Kommunikationsmuster optimieren – indem sie das leichtgewichtige QoS 0 für häufige, unkritische Daten verwenden und die robusteren QoS 1 und QoS 2 für Nachrichten reservieren, bei denen eine Zustellbestätigung unerlässlich ist.
Wie funktioniert die Nachrichtenübertragung mit MQTT QoS?
Beim Thema QoS in MQTT ist es wichtig, die Nachrichtenübermittlung sowohl vom veröffentlichenden Client zum Broker als auch vom Broker zum abonnierenden Client zu betrachten. Diese beiden Aspekte der Nachrichtenübermittlung weisen feine Unterschiede auf.
Der Client, der eine Nachricht an den Broker veröffentlicht, legt während der Übertragung das QoS-Level der Nachricht fest. Der Broker übermittelt die Nachricht dann an die abonnierenden Clients unter Verwendung des QoS-Levels, das jeder abonnierende Client während des Abonnementprozesses definiert hat. Wenn der abonnierende Client ein niedrigeres QoS-Level als der veröffentlichende Client angibt, überträgt der Broker die Nachricht mit dem niedrigeren QoS-Level.
Das Verständnis der Funktionsweise der Nachrichtenübermittlung in MQTT bildet die Grundlage dafür, die Bedeutung der Quality of Service (QoS)-Level für eine zuverlässige Kommunikation zwischen dem veröffentlichenden Client, dem Broker und dem abonnierenden Client zu erkennen.
Vorteile von QoS für zuverlässige IoT-Kommunikation
Quality of Service (QoS) ist für MQTT von entscheidender Bedeutung, da es dem Client die Möglichkeit gibt, ein Servicelevel zu wählen, das sowohl zur Netzwerkzuverlässigkeit als auch zu den Anforderungen der Anwendung passt. Die Fähigkeit von MQTT, Nachrichten erneut zu übertragen und ihre Zustellung auch unter unzuverlässigen Netzwerkbedingungen sicherzustellen, macht QoS zu einem wichtigen Bestandteil für eine reibungslose Kommunikation in solchen anspruchsvollen Umgebungen. Durch die Bereitstellung verschiedener QoS-Stufen ermöglicht MQTT den Clients, ihre Netzwerknutzung zu optimieren und das gewünschte Gleichgewicht zwischen Zuverlässigkeit und Effizienz zu erreichen.
Nachdem wir nun die Bedeutung von Quality of Service (QoS) im MQTT verstanden haben, werfen wir einen genaueren Blick auf die Funktionsweise von QoS und untersuchen, wie es zuverlässige Nachrichtenübermittlung unter unterschiedlichen Netzwerkbedingungen gewährleistet.
Wie funktioniert QoS 0 in MQTT?
Auf der niedrigsten Ebene bietet QoS 0 in MQTT einen Zustellmechanismus nach dem Best-Effort-Prinzip, bei dem der Sender weder eine Empfangsbestätigung erwartet noch eine Zustellung der Nachricht garantiert wird. Das bedeutet, dass der Empfänger den Erhalt der Nachricht nicht bestätigt und der Sender die Nachricht weder speichert noch erneut überträgt. QoS 0, oft als „Fire and Forget“ bezeichnet, funktioniert ähnlich wie das zugrunde liegende TCP-Protokoll, bei dem die Nachricht ohne weitere Nachverfolgung oder Bestätigung gesendet wird.
Quality of Service level 0: delivery at most once
Wie funktioniert QoS 1 in MQTT?
Bei QoS 1 in MQTT liegt der Fokus darauf, die Zustellung der Nachricht mindestens einmal an den Empfänger sicherzustellen. Wenn eine Nachricht mit QoS 1 veröffentlicht wird, behält der Sender eine Kopie der Nachricht, bis er ein PUBACK-Paket vom Empfänger erhält, das den erfolgreichen Empfang bestätigt. Erhält der Sender das PUBACK-Paket nicht innerhalb eines angemessenen Zeitrahmens, überträgt er die Nachricht erneut, um die Zustellung sicherzustellen.
Quality of Service level 1: delivery at least once
Nach dem Empfang der Nachricht kann der Empfänger sie sofort verarbeiten. Wenn der Empfänger beispielsweise ein MQTT-Broker ist, verteilt er die Nachricht an alle abonnierenden Clients und antwortet mit einem PUBACK-Paket, um den Erhalt der Nachricht zu bestätigen.
MQTT PUBACK packet
Es ist wichtig zu beachten, dass bei QoS 1 der veröffentlichende Client beim erneuten Senden derselben Nachricht ein Duplikat-Flag (DUP) setzt. Dieses Flag dient jedoch internen Zwecken und wird weder vom Broker noch vom Client verarbeitet. Unabhängig vom DUP-Flag sendet der Empfänger dennoch ein PUBACK-Paket, um den Empfang der Nachricht zu bestätigen und dem Sender somit die erfolgreiche Zustellung mitzuteilen.
Dieser Ansatz von QoS 1 stellt ein Gleichgewicht zwischen Zuverlässigkeit und Effizienz her, indem sichergestellt wird, dass die Nachricht den Empfänger mindestens einmal erreicht, wobei mögliche Duplikate entsprechend behandelt werden können.
If you are looking to understand MQTT control packets and their structure at a granular level in order to design and test MQTT-based systems, read our blog MQTT Packets: A Comprehensive Guide.
Wie funktioniert QoS 2 in MQTT?
QoS 2 bietet das höchste Serviceniveau in MQTT und stellt sicher, dass jede Nachricht genau einmal an die vorgesehenen Empfänger zugestellt wird. Um dies zu erreichen, beinhaltet QoS 2 einen vierstufigen Handshake zwischen Sender und Empfänger.
MQTT Quality of Service level 2: delivery exactly once
Wenn ein Empfänger ein QoS-2-PUBLISH-Paket von einem Sender erhält, verarbeitet er die veröffentlichte Nachricht entsprechend und antwortet dem Sender mit einem PUBREC-Paket, das den Empfang des PUBLISH-Pakets bestätigt. Falls der Sender kein PUBREC-Paket vom Empfänger erhält, sendet er das PUBLISH-Paket erneut mit gesetztem Duplikat-Flag (DUP), bis er eine Bestätigung erhält.
MQTT PUBREC Packet
Sobald der Sender ein PUBREC-Paket vom Empfänger erhält, kann er das ursprüngliche PUBLISH-Paket sicher verwerfen. Der Sender speichert das PUBREC-Paket des Empfängers und antwortet mit einem PUBREL-Paket. Der Empfänger verwirft daraufhin alle gespeicherten Zustände und antwortet mit einem PUBCOMP-Paket.
MQTT PUBREL Packet
Nachdem der Empfänger das PUBREL-Paket erhält, kann er alle gespeicherten Zustände verwerfen und mit einem PUBCOMP-Paket antworten (dies gilt ebenso, wenn der Sender das PUBCOMP-Paket erhält). Bis der Empfänger die Verarbeitung abgeschlossen und das PUBCOMP-Paket an den Sender zurückgesendet hat, speichert er eine Referenz zur Paketkennung des ursprünglichen PUBLISH-Pakets. Dieser Schritt ist wichtig, um eine doppelte Verarbeitung der Nachricht zu vermeiden.
Nachdem der Sender das PUBCOMP-Paket erhalten hat, wird die Paketkennung der veröffentlichten Nachricht zur Wiederverwendung freigegeben.
MQTT PUBCOMP Packet
Wenn der QoS-2-Ablauf abgeschlossen ist, können beide Parteien sicher sein, dass die Nachricht zugestellt wurde und der Sender eine Bestätigung über die Zustellung erhalten hat.
Geht unterwegs ein Paket verloren, ist der Sender dafür verantwortlich, die Nachricht innerhalb eines angemessenen Zeitraums erneut zu senden. Dies gilt gleichermaßen, unabhängig davon, ob der Sender ein MQTT-Client oder ein MQTT-Broker ist. Der Empfänger ist verpflichtet, auf jede Steuerungsnachricht entsprechend zu reagieren.
Was sind die wichtigsten Überlegungen zu QoS in MQTT?
Beim Verständnis von QoS in MQTT gibt es mehrere wichtige Aspekte zu beachten:
Herabstufung des QoS
Die vom Sender und Empfänger definierten QoS-Stufen können voneinander abweichen. Der Client, der die Nachricht an den Broker sendet, legt das QoS-Level fest, während der Broker das QoS verwendet, das der Empfänger beim Abonnieren angegeben hat. Wenn der Sender zum Beispiel QoS 2 verwendet und der Empfänger mit QoS 1 abonniert, liefert der Broker die Nachricht mit QoS 1 an den Empfänger. Dies kann dazu führen, dass die gleiche Nachricht mehrfach an den Empfänger zugestellt wird.
Paketkennungen sind pro Client eindeutig
Paketkennungen, die bei QoS 1 und 2 verwendet werden, sind innerhalb einer Interaktion zwischen einem bestimmten Client und einem Broker eindeutig. Sie sind jedoch nicht global über alle Clients hinweg eindeutig. Sobald eine Interaktion abgeschlossen ist, wird die Paketkennung wieder zur Wiederverwendung freigegeben. Aus diesem Grund muss die Paketkennung nicht größer als 65535 sein, da es unrealistisch ist, dass ein Client mehr Nachrichten sendet, ohne eine Interaktion abzuschließen.
Best Practices für MQTT QoS 0, 1, 2
Wir werden häufig gefragt, wie man das richtige QoS-Level auswählt. Die Auswahl des geeigneten QoS-Levels hängt vom jeweiligen Anwendungsfall ab. Hier sind einige Richtlinien, die bei der Entscheidungsfindung helfen:
Verwenden Sie QoS 0, wenn:
Eine durchgehend oder überwiegend stabile Verbindung zwischen Sender und Empfänger besteht. Ein klassischer Anwendungsfall ist die Verbindung eines Test-Clients oder einer Front-End-Anwendung mit einem MQTT-Broker über eine kabelgebundene Verbindung.
Es kein Problem darstellt, wenn gelegentlich Nachrichten verloren gehen. Der Verlust einiger Nachrichten ist akzeptabel, wenn die Daten nicht sehr wichtig sind oder in kurzen Intervallen gesendet werden.
Sie keine Nachrichtenwarteschlangen benötigen. Nachrichten werden nur für getrennte Clients mit QoS 1 oder 2 und einer persistenten Sitzung zwischengespeichert.
Verwenden Sie QoS 1, wenn:
Jede Nachricht ankommen muss und Ihre Anwendung mit Duplikaten umgehen kann. QoS 1 ist das am häufigsten genutzte Servicelevel, da es garantiert, dass die Nachricht mindestens einmal zugestellt wird – auch wenn dies mehrfach geschieht. Ihre Anwendung muss also Duplikate tolerieren und entsprechend verarbeiten können.
Der Overhead von QoS 2 zu hoch ist. QoS 1 liefert Nachrichten wesentlich schneller als QoS 2.
Verwenden Sie QoS 2, wenn:
Es für Ihre Anwendung entscheidend ist, dass alle Nachrichten genau einmal zugestellt werden. Dies ist oft der Fall, wenn doppelte Zustellungen für Benutzer oder abonnierende Clients problematisch sein können. Beachten Sie jedoch den höheren Overhead und dass die QoS-2-Interaktion mehr Zeit zur Ausführung benötigt.
Warteschlangen für QoS-1- und QoS-2-Nachrichten
Alle Nachrichten, die mit QoS 1 und 2 gesendet werden, werden für offline Clients in die Warteschlange gestellt, bis der Client wieder verfügbar ist. Diese Warteschlangenfunktion ist jedoch nur möglich, wenn der Client über eine persistente Sitzung verfügt.
Fazit
Die Quality of Service (QoS)-Stufen in MQTT bieten entscheidende Flexibilität für IoT-Anwendungen, indem sie Entwicklern ermöglichen, fundierte Abwägungen zwischen Zuverlässigkeit und Effizienz zu treffen. QoS 0 steht für leichtgewichtige „Fire and Forget“-Nachrichten und eignet sich ideal für stabile Verbindungen. QoS 1 gewährleistet eine Zustellung mindestens einmal und ist geeignet für wichtige Nachrichten, bei denen gelegentliche Duplikate tolerierbar sind. Für kritische Kommunikation, die eine genau einmalige Zustellung erfordert, bietet QoS 2 mit seinem vierstufigen Handshake die höchste Zuverlässigkeit – allerdings mit zusätzlichem Overhead.
Durch das Verständnis dieser Optionen und die Anwendung bewährter Verfahren – wie der Einsatz von QoS 0 für nicht-kritische, häufige Updates, QoS 1 für allgemeine Zuverlässigkeit und QoS 2 für missionskritische Befehle – können Entwickler ihre MQTT-Implementierungen optimal auf Leistung und Zuverlässigkeit in unterschiedlichen Netzwerkbedingungen abstimmen. Dabei ist zu beachten, dass für die Nachrichtenwarteschlange mit QoS 1 und 2 persistente Sitzungen erforderlich sind, damit offline Clients ihre Nachrichten beim Wiederverbinden empfangen können.
FAQs
HiveMQ Team
The HiveMQ team loves writing about MQTT, Sparkplug, Unified Namespace (UNS), Industrial IoT protocols, IoT Data Streaming, how to deploy our platform, and more. We focus on industries ranging from energy, to transportation and logistics, to automotive manufacturing. Our experts are here to help, contact us with any questions.