EMQ X MQTT 5.0 服務器的保留消息與消息過期間隔

保留消息

服務端收到 Retain 標誌爲 1 的 PUBLISH 報文時,會將該報文視爲保留消息,除了被正常轉發以外,保留消息會被存儲在服務端,每個主題下只能存在一份保留消息,因此如果已經存在相同主題的保留消息,則該保留消息被替換。

當客戶端建立訂閱時,如果服務端存在主題匹配的保留消息,則這些保留消息將被立即發送給該客戶端。藉助保留消息,新的訂閱者能夠立即獲取最近的狀態,而不需要等待無法預期的時間,這在很多場景下非常重要的。

保留消息雖然存儲在服務端中,但它並不屬於會話的一部分。也就是說,即便發佈這個保留消息的會話終結,保留消息也不會被刪除。刪除保留消息只有兩種方式:

  1. 客戶端往某個主題發送一個 Payload 爲空的保留消息,服務端就會刪除這個主題下的保留消息。
  2. 如果包含保留消息的 PUBLISH 報文設置了消息過期間隔屬性,那麼保留消息在服務端存儲超過過期時間後就會被刪除。

消息過期間隔

PUBLISH 報文可以設置消息過期間隔這一屬性,消息過期間隔是一個四字節的整數,表示應用消息的生命週期,單位是秒。

如果 PUBLISH 報文不設置消息過期間隔,那麼應用消息不會過期。

如果 PUBLISH 報文設置了消息過期間隔,並且消息過期將已經過期,服務端還沒開始向匹配的訂閱者交付該消息,那麼服務端必須刪除該消息。

EMQ X MQTT 服務器的保留消息

EMQ X MQTT Broker 的保留消息功能是由 emqx_retainer 插件實現,該插件默認開啓,通過修改 emqx_retainer 插件的配置,可以調整 EMQ X Broker 儲存保留消息的位置,限制接收保留消息數量和 Payload 最大長度,以及調整保留消息的過期時間。

emqx_retainer 插件默認開啓,插件的配置路徑爲 etc/plugins/emqx_retainer.conf

  • retainer.storage_type

    保留消息的儲存位置,EMQ X Broker 可以選擇將保留消息僅儲存在內存中,僅儲存在硬盤中,或是同時儲存在內存和硬盤中,可以由用戶的業務特點靈活決定。

    例如,想要收集電錶讀數的用戶可能會決定使用 QoS 等級 1 的消息,因爲他們不能接受數據在網絡傳輸途中丟失,但是,他們可能認爲客戶端和服務端的數據可以存儲在內存(易失性存儲器)中,因爲電力供應系統是非常可靠的,不會有太大的數據丟失風險。

    與之相反,停車計費支付應用的提供商可能決定任何情況下都不能讓數據支付消息丟失,因此他們要求在通過網絡傳輸之前將所有的數據寫入到硬盤中(非易失性存儲器)。

  • retainer.max_retained_messages、retainer.max_payload_size

    retainer.max_retained_messages 規定了 EMQ X Broker 可以儲存的保留消息的最大數量,0 表示沒有限制。保留消息數量超出最大值限制後,可以替換已存在的保留消息,但不能爲新的主題儲存保留消息。

    retainer.max_payload_size 規定了 EMQ X Broker 可以接收的保留消息的最大 Payload 值。Payload 大小超出最大值後 EMQ X 消息服務器會把收到的保留消息作爲普通消息處理,不再儲存此消息。

    這兩項配置規定了 EMQ X Broker 可以接收與儲存的保留消息的上限,保證了 EMQ X Broker 不會佔用過多的資源來儲存和處理保留消息。

  • retainer.expiry_interval

    保留消息的過期時間,0 表示永不過期。如果 PUBLISH 報文中設置了消息過期間隔,那麼以 PUBLISH 報文中的消息過期間隔爲準。

    當保留消息的過期後,EMQ X Broker 會刪除掉此消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章