EMQ X MQTT 5.0 伺服器的保留訊息與訊息過期間隔

EMQX發表於2020-03-31

保留訊息

服務端收到 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 會刪除掉此訊息。

相關文章