Retain
MQTT definiert keinen Mechanismus, damit dem Publisher einer Nachricht garantiert wird, dass ein Subscriber die Nachricht auch wirklich empfangen hat. Der Publisher kann über das QoS-Level lediglich sicherstellen, dass die Nachricht sicher am Message Broker abgeliefert wurde. Auf der anderen Seite kann auch ein Subscriber nicht sicherstellen, wann ein Publisher eine Nachricht gesendet hat. Im worst-case subscribed sich der Empfänger erst auf das Topic, nachdem der Publisher eine Nachricht gesendet hat. In diesem Fall würde der Subscriber die Nachricht nicht empfangen. Ist das Retain-Flag beim Publish gesetzt, so würde der Subscriber es hingegen empfangen. Das folgende Schaubild verdeutlicht diesen Zusammenhang noch einmal:
Das sogenannte Retain-Flag bietet beim Publish-Vorgang die Möglichkeit, dem Message Broker mitzuteilen, dass dieser die Nachricht persistent in dem entsprechenden Topic vorhält. Der Message Broker speichert hierbei immer die zuletzt gesendete Retain-Nachricht. Jeder Client, der sich auf dieses Topic subscribed (entweder vor oder nach dem Publish) bekommt diese Nachricht dann sofort zugestellt sobald er die Subscription eingerichtet wird. Dieser Vorgang funktioniert ebenfalls für Wildcard Subscriptions.
Eine Retain-Nachricht kann auch wieder aus einem Topic entfernt werden, indem eine Nachricht ohne Payload bei gesetztem Retain-Flag an das entsprechende Topic gesendet wird.