第 16 章

訊息與主題管理

EMQX 訊息與主題管理:Message publish、retained 訊息管理、主題樹、Topic Metrics 與延遲發布(Delayed Publish)。

為什麼要學這個

MQTT 的訊息是「發布/訂閱」制的:它不會被 broker 存檔永久保留,除非你用了 retained 的旗標。因此「某個訊息到底有沒有被留住、位在哪個主題、是否照預期送出」這些問題,就需要在 Dashboard 裡那幾個訊息管理頁面上找答案。

這章帶你認識與訊息/主題相關的 Dashboard 功能:發布與測試用的 WebSocket Client、retained(保留)訊息的管理與設定、主題的總覽入口,以及(Enterprise)主題度量與延遲發布。讀完之後,你就能回答「這筆訊息還在哪裡」。

核心概念

Retained Message(保留訊息):當客戶端用 RETAIN 旗標發布訊息,EMQX 會把它存在系統裡。之後任何客戶端新訂閱這個主題,立刻就會收到這一筆 retained 訊息。它「預設不會過期」,除非你手動刪除。

Dashboard 的 Monitoring → Retained Messages 頁列出目前所有 retained 訊息(主題、QoS、發布者、發布時間),你可以按 Show Payload 看內容、或按 Delete 刪掉某筆。

Delayed Publish(延遲發布) 是 EMQX Enterprise 的延伸功能:發布到 `$delayed/{DelayInterval}/{Topic}` 的訊息,會照你指定的秒數延後送出。這與 retained 是兩種不同的工具:它負責把發布延後,而不是「留住最新一筆」。

注意界線:Delayed Publish 與 Topic Metrics 都是 EMQX Enterprise 版功能,Open Source 5.8.9 的 Dashboard 不顯示。

名詞對照

英文中文說明
Publish發布client 把一則訊息寫進主題
Subscribe訂閱client 對某主題接收訊息的意願
Payload內容體訊息的資料內容(字串、JSON、二進位)
Retained Message保留訊息broker 記住並在新訂閱時立即送出的訊息
Retainer保留器管理 retained 訊息功能的設定分頁
Delayed Publish延遲發布依照 $delayed/ 前綴延後送出的 MQTT 延伸功能

動手做

  1. 進 Retained Messages 頁

    左側 Monitoring → Retained Messages,看到目前系統中所有 retained 訊息清單。

  2. 看某一筆的 payload

    在該列的 Actions 按下 Show Payload,下方彈出內容;可選擇 JSON 或 Hex 等格式,右下按 Copy 可複製。

  3. 刪掉一筆 retained

    按該列的 Delete 移除;或用 Clear All 清掉整群 cluster 的 retained。

  4. 用 WebSocket Client 試發布

    左側 Diagnose → WebSocket Client,新增一個連線,用 subscribe/publish 快速驗證某主題與 retained 行為。

管理保留訊息與設定

清單左上方是Show Payload 與 Delete,右上方 Refresh 重新載入清單。Settings 會帶你到 Management → MQTT Settings → Retainer 分頁,在那裡你可以啟用/停用保留訊息功能,並設定多項參數。

設定欄位預設值說明
Storage Type(儲存類型)Built-in Database儲存的後台
Storage Method(儲存方式)ramram:只存記憶體;disc:記憶體+硬碟
Max Retained Messages(上限)00=不限;超過時以新換舊
Max Payload Size1MB超過會被視為一般訊息,不保留
Message Expire IntervalNever0=不過期;可設幾小時後自動刪

EMQX 預設會保留三則 $SYS 系統主題的 retained 訊息(例如節點描述、版本、叢集節點清單)。若要「把某個主題的 retained 清掉」,最常用的作法是發布一則空訊息到該主題。

主題總覽與主題度量

Dashboard 的 Monitoring → Subscriptions → Topics 分頁,把所有節片上目前被訂閱的主題去重(去重複)後列成一份清單;你可以用模糊搜尋找主題,並在「Actions」欄按 Create Monitor 帶到主題度量頁。

Topic Metrics(主題度量)是 EMQX Enterprise 功能的診斷工具,位置是 Diagnose → Topic Metrics。它的用途是只針對「一個特定主題」統計訊息量。

新增時要輸入一個完整的主題名稱;目前不支援帶萬用字元(`+`、`#`)的主題過濾器。a/+ 這種寫法無法建立度量。

在清單的 Actions 你可以在 View 開啟明細(依 QoS 分層看),Reset 重新開始計、Delete 移除該筆。

Delayed Publish(Enterprise)

Delayed Publish 是 EMQX 的 MQTT 擴充功能:當 client 發布的主題開頭是 $delayed/,EMQX 就會把這筆訊息「延後」一段時間才送到真實主題。

格式是:

$delayed/{DelayInterval}/{TopicName}
  • $delayed/15/x/y:15 秒後發布到 x/y。
  • $delayed/60/a/b:1 分鐘後發布到 a/b。
  • $delayed/3600/$SYS/topic:1 小時後發布給 $SYS/topic。

{DelayInterval} 最大可到 4294967 秒;如果無法被解析成整數,EMQX 會把這筆訊息丟棄。

要管理這個功能,從左側 Management → Delayed Publish 進入設定,可啟用/停用並限制最大延遲訊息數。

故障排除

  • 訂閱某主題卻沒收到 retained 訊息:確認那筆 retained 還在(Retained Messages 頁看得到);若已刪除,就不會再送。
  • 想刪掉某主題的 retained 卻按不到 Delete:更常用的做法是直接發布一筆「空訊息」到該主題(RETAIN),這也會把舊的蓋掉。
  • 找不到 Delayed Publish 或 Topic Metrics 頁:兩者都屬 EMQX Enterprise 版,Open Source 5.8.9 的 Dashboard 不顯示,不是壞掉。
  • Topic Metrics 新增時不接受帳號:這個功能目前只支援單一主題,不支援 +/# 萬用字元;改用完整主題名重新建。

常見問題

Retained Message 會自動過期嗎

預設不會。除非你主動刪除、發布空訊息蓋掉,或是在 Retainer 設定中給了過期時間(Message Expire Interval)。你可以在 PUBLISH packet 帶上不同的過期秒數,優先採 PUBLISH 的值。

為什麼重發 retained 後,訂閱者收到的不是新值

通常因為那筆 retained 已經被清掉了,或重新發布時沒用 RETAIN 旗標。用 RETAIN 發布一筆新訊息到同一主題,保留訊息會以同一主題相同欄位覆蓋舊值。

Delayed Publish 與 retained 是不是同一件事

不是。retained 是「記住最後一筆,新訂閱者都能立刻拿到」;Delayed Publish 是「延後送出」(`$delayed/` 前綴)。兩者可以一起用,但角色不同,且 Delayed 是 Enterprise 功能。

Topic Metrics 為什麼不能用 a/+

官方文件明列:「主題度量只支援單一主題名稱」,也就是說 `+` / `#` 萬用字元目前不支援。要監控,請用一個確定的主題名。

官方來源