QoS

QoS (Quality-of-Service) ist eine Vereinbarung zwischen dem Client und Message Broker in Bezug auf das Garantieren der Nachrichtenübermittlung. Das sogenannte QoS-Level muss hierbei sowohl beim Publish- als auch beim Subscribe-Vorgang vom Client angegeben werden. Es existieren drei verschiedene QoS-Level:

QoS 1:

Zusammenspiel von Publisher- und Subscriber-QoS

Die MQTT-Spezifikation (MQTT5, Kapitel 3.8.4) definiert ein paar grundlegende Regeln beim Zusammenspiel von Publisher- und Subscriber-QoS, insbesondere wenn Publisher und Subscriber ein unterschiedliches Qos-Level angeben.

QoS-Level 0

Bei diesem QoS-Level erfolgt keine Bestätigung des Empfängers, ob die Nachrichten empfangen wurden oder nicht. In der Folge wird die Nachricht auch kein zweites Mal gesendet.

Die folgende Grafik veranschaulicht diesen Zusammenhang noch einmal, vor allem im Vergleich mit der unterlagerten TCP-Ebene.

QoS 2:

QoS-Level 1

Bei diesem QoS-Level wird garantiert, dass die Nachricht zumindest einmal beim Empfänger ankommt. Aber die Nachricht kann unter Umständen auch mehrfach beim Empfänger eintreffen. Der Sender speichert die Nachricht intern bis er eine Bestätigung in Form einer PUBACK-Nachricht vom Empfänger erhält. Wenn die PUBACK-Nachricht für eine bestimmte Zeit ausbleibt, wird die Nachricht erneut gesendet.

Die folgende Grafik veranschaulicht diesen Zusammenhang noch einmal, vor allem im Vergleich mit der unterlagerten TCP-Ebene.

QoS 3:

QoS-Level 2

Bei diesem QoS-Level wird garantiert, dass die Nachricht maximal einmal beim Empfänger ankommt. Dies wird MQTT-seitig durch einen Handshake-Mechanismus realisiert. QoS-Level 2 ist der sicherste (aus Sicht der Nachrichtenübermittlung), aber auch langsamste QoS-Level. Wenn ein Empfänger eine Nachricht mit QoS-Level 2 erhält, bestätigt er die Nachricht mit einem PUBREC. Der Absender der Nachricht merkt sich diese intern bis er ein PUBCOMP empfangen hat. Dieser zusätzliche Handshake (verglichen mit QoS 1) ist wichtig, damit die Nachricht nicht doppelt übertragen wird. Wenn der Absender der Nachricht ein PUBREC erhält, kann er den initialen Publish verwerfen, da er weiß, dass die Nachricht einmal vom Empfänger empfangen wurde. Er merkt sich somit intern den PUBREC und sendet seinerseits ein PUBREL. Nachdem der Empfänger ein PUBREL empfangen hat, kann er die sich zuvor gemerkten Zustände verwerfen und mit einem PUBCOMP antworten. Umgekehrt genauso. Immer dann, wenn ein Paket verloren geht, ist der jeweilige Kommunikationsteilnehmer dafür verantwortlich, die zuletzt gesendete Nachricht nach einer bestimmten Zeit noch einmal zu senden.

Die folgende Grafik veranschaulicht diesen Zusammenhang noch einmal, vor allem im Vergleich mit der unterlagerten TCP-Ebene.

QoS 4: