訊息與主題管理
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 延伸功能 |
動手做
進 Retained Messages 頁
左側 Monitoring → Retained Messages,看到目前系統中所有 retained 訊息清單。
看某一筆的 payload
在該列的 Actions 按下 Show Payload,下方彈出內容;可選擇 JSON 或 Hex 等格式,右下按 Copy 可複製。
刪掉一筆 retained
按該列的 Delete 移除;或用 Clear All 清掉整群 cluster 的 retained。
用 WebSocket Client 試發布
左側 Diagnose → WebSocket Client,新增一個連線,用 subscribe/publish 快速驗證某主題與 retained 行為。
管理保留訊息與設定
清單左上方是Show Payload 與 Delete,右上方 Refresh 重新載入清單。Settings 會帶你到 Management → MQTT Settings → Retainer 分頁,在那裡你可以啟用/停用保留訊息功能,並設定多項參數。
| 設定欄位 | 預設值 | 說明 |
|---|---|---|
| Storage Type(儲存類型) | Built-in Database | 儲存的後台 |
| Storage Method(儲存方式) | ram | ram:只存記憶體;disc:記憶體+硬碟 |
| Max Retained Messages(上限) | 0 | 0=不限;超過時以新換舊 |
| Max Payload Size | 1MB | 超過會被視為一般訊息,不保留 |
| Message Expire Interval | Never | 0=不過期;可設幾小時後自動刪 |
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/+
官方文件明列:「主題度量只支援單一主題名稱」,也就是說 `+` / `#` 萬用字元目前不支援。要監控,請用一個確定的主題名。