簡體   English   中英

MQTT 代理是否支持持久訂閱?

[英]Does MQTT brokers support persistent subscriptions?

我在我的第一個 IOT POC 上工作,該設備通常每小時/每天生成一次傳感器數據。 我計划擁有這樣的架構: - 1 個用於傳感器數據輸入的共享主題(設備到后端方向) - 每個設備最初都會訂閱自己的特定主題,即 /device/{id}/notification

現在,在傳感器數據提交到共享主題后,我打算讓設備進入深度睡眠(設備只能通過 wifi 數據包或定時器喚醒),在這種狀態下,與代理的 TCP 連接丟失。

問題:設備重新喚醒並重新建立與 MQTT 代理的 TCP 連接后,設備是否會收到服務器在停止服務期間生成的所有消息,或者這些消息將不可用?

在客戶端連接到代理期間, CleanSession標志使代理能夠將丟失的 QoS 1 或 QoS 2 消息排隊(存儲 QoS 0 消息取決於實現)。

MQTT 3.1.1 標准Section 3.1.2.4規定:

如果 CleanSession 設置為 0,則服務器必須根據當前會話的狀態(由客戶端標識符標識)恢復與客戶端的通信。 如果沒有與客戶端標識符關聯的會話,服務器必須創建一個新的會話。 在客戶端和服務器斷開連接后,客戶端和服務器必須存儲會話 [MQTT-3.1.2-4]。 在 CleanSession 設置為 0 的會話斷開連接后,服務器必須存儲進一步的 QoS 1 和 QoS 2 消息,這些消息與客戶端在斷開連接時擁有的任何訂閱相匹配,作為會話狀態的一部分 [MQTT-3.1.2- 5]。 它還可以存儲滿足相同標准的 QoS 0 消息

持久會話的問題在於它可能會將大量消息排隊,因此在重新連接時,客戶端會被丟失的消息轟炸。 如果您需要知道完整的讀數序列,這可能是可取的,或者如果客戶端在低功耗、電池供電的嵌入式設備上運行,則這可能是非常不受歡迎的。

為了解決這個問題,MQTT 提供了另一個特性:在發布消息中retained標志。

MQTT 3.1.1 標准第 3.3.1.3 節規定:

如果 RETAIN 標志設置為 1,則在客戶端發送給服務器的 PUBLISH 數據包中,服務器必須存儲應用消息及其 QoS,以便可以將其傳遞給訂閱與其主題名稱匹配的未來訂閱者 [MQTT- 3.3.1-5]。 當建立新訂閱時,必須將每個匹配主題名稱上最后保留的消息(如果有)發送給訂閱者 [MQTT-3.3.1-6]。 如果服務器收到一個 QoS 0 消息,並且 RETAIN 標志設置為 1,它必須丟棄先前為該主題保留的任何消息。 它應該將新的 QoS 0 消息存儲為該主題的新保留消息,但可以隨時選擇丟棄它 - 如果發生這種情況,該主題將沒有保留消息

這確保在重新連接時,客戶端僅收到有關給定主題的最新消息。

很快,我自己找到了答案。 持久會話是答案。 我一直在尋找持久訂閱,但最初並沒有成功......

這是關於我的案例的最后一篇很棒的文章: http : //www.hivemq.com/blog/mqtt-essentials-part-7-persistent-session-queuing-messages

所以是的,持久訂閱稱為持久會話,是的,這是可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM