第 14 章

客戶端與訂閱管理

EMQX 客戶端與訂閱管理:Clients 清單、踢除與統計、Subscriptions 連線與訂閱明細、慢訂閱與主題監控。

為什麼要學這個

智慧家庭裡最常見的狀況,是某台裝置「明明設定好了,卻收不到訊息」。退一步想,要把問題找出來,你得先能回答幾件事:哪個 client 正在連線、它到底訂了哪些主題、訊息有沒有真的送出去。EMQX 的 Clients 與 Subscriptions 頁,就是把這些「連線的事實」講清楚的地方。

這章帶你建立一套停線診斷流程:先到 Clients 清單確認誰在線上、哪一台有 session,再看 Subscriptions 掌握訂閱細節,最後認識慢訂閱與主題監控工具(以及它們的授權)。讀完之後,遇到「收不到訊息」這類問題,你就不必瞎猜,能先在 Dashboard 上把範圍縮小。

核心概念

EMQX 的 Clients 頁顯示「目前連線的 client」以及「尚未過期的 session」。連線(connection)是一條活的 MQTT 通道;而 session 是 EMQX 替該 client 保留的狀態,在連線斷掉後如果設為持久(persistent)並給定了 session 過期時間,它仍會存在數秒。 所以 Clients 清單裡看到的,不只是「這一秒在線」的裝置。

Subscriptions 頁以「client ID × topic」為單位列出所有訂閱,並補上 QoS 與 MQTT 5.0 的新訂閱選項;Topics 分頁則以「主題名稱」去重,把同一台節點的相同訂閱只列一次。

先講一個界線:Slow Subscriptions(慢訂閱統計)與 Topic Metrics(主題度量)是 EMQX Enterprise 版功能,Open Source 5.8.9 的 Diagnose 左欄看不到它們。知道這條界線,你就不會在自架 Open Source 版時找不到工具而白費時間。

名詞對照

英文中文說明
Client客戶端連上 EMQX 的 MQTT 裝置或程式
Connection連線client 與 EMQX 之間的活通道
Session會話EMQX 替 client 保留的訂閱與訊息狀態
Subscription訂閱client 對某主題表達接收訊息的意願
QoS服務品質0/1/2 三級投遞保證
Kick Out踢除強制中斷某 client 的連線

動手做

  1. 開啟 Clients 清單

    左側選 Monitoring → Clients。預設顯示目前連線的 client,欄位含 client ID、username、連線狀態、IP、heartbeat、session 資訊與連線完成時間。

  2. 用過濾條件找一台裝置

    頂端搜尋列可用 client ID 或 username 做模糊搜尋;展開右側箭頭後,可有連線狀態、時間範圍、目標 IP 等過濾欄。

  3. 看某台 client 的明細

    在清單點 client ID,進入連線明細頁。右上可手動重新整理、也可手動清除 session;下方能看到該連線目前的訂閱主題。

  4. 踢除一台 client

    回到清單,勾選一台 client,按 Kick Out 中斷連線。若該 client 是持久 session、有 session 到期,重連後還是會對回同一 session。

Clients 清單與明細細節

清單最上,Select Column 讓你可選擇顯示哪些欄位;Refresh 會重置所有過濾條件並重新載入。IP 位址欄是把 client 的來源 IP 與所用連接埠併起來顯示。

點入明細頁後,除了清單上已有的基本資訊,還多了幾項:連線使用的協定版本(例如 MQTT 3.1.1 或 5.0)、session 是否要在離線後清理、以及(如果已離線)上次離線的時間。

明細的最上方與資訊分成兩區:Connection Information(連線資訊)與右側 Session Information(會話資訊)。session 欄位包括 session 過期時間、建立時間、訂閱數量、訊息佇列長度、傳輸視窗長度、QoS2 接收佇列長度。

再往下是流量、訊息與封包的統計指標,方便你只看一台 client 的進出量。整頁底部就是它目前訂閱的主題:可以按 Add Subscription 補一個簡單訂閱,或在清單按 Unsubscribe 取消。

Subscriptions 與 Topics

Subscriptions 頁把每個連線的訂閱,以「client ID + topic」建欄列出,包含 QoS 與 MQTT 5.0 的新訂閱選項:

  • No Local:設為 1 時,server 不會把自己的訊息轉回給你。
  • Retain As Published:指定轉發訊息時要不要保留 RETAIN 旗標(這與 retained 訊息本身的 RETAIN 旗標無關)。
  • Retain Handling:訂閱時 server 何時送 retained 訊息。0=訂閱成功就送;1=只有當舊訂閱不存在才送;2=無論如何不送。

搜尋列預設有 Node、Client ID、Topic 三個過濾欄;展開箭頭後還可填 QoS 與共享訂閱名(Shared Name)。

Topics 頁則把所有節點上、目前被訂閱的主題去重整成一份清單,可模糊搜尋。某列的 Create Monitor 會帶你到 Diagnose → Topic Metrics 建立這主題的監控。

提醒:Subscriptions 是「以 client 為單位」,Topics 是「以主題為單位」;同一主題可能同時被不同 client 訂閱,兩欄才都很重要。

慢訂閱與主題監控(Enterprise)

若一台裝置明明在線、卻收訊息很慢,EMQX 的 Slow Subscriptions 能統計「從訊息抵達 EMQX、到送出完成」的延遲。在 Diagnose → Slow Subscriptions 啟用後,可以設統計門檻(Stats Threshold,最小 100ms)、紀錄筆數上限(最多 1000 筆)、紀錄淘汰時間(預設 300 秒),以及計算方式(whole/internal/response)。

清單以延遲時間由大到小排序,欄位有 Client ID、Topic、Duration、Node、Updated;點 Client ID 可以開此 client 的明細,深入調查。

Topic Metrics 則專門統計特定主題:在 Diagnose → Topic Metrics(或 Topics 頁的 Create Monitor)新增一筆監控,指定一個主題名稱。要注意這個功能「不能用萬用字元」,+ 或 # 目前都不支援;只能用完整主題名。

兩種都僅限 EMQX Enterprise 版。如果你是 Open Source 5.8.9,其實你所在的 Diagnose 左欄就不會有它們。

故障排除

  • 在 Clients 找不到某台裝置:先用 client ID 或 username 模糊搜尋;也確認它真的連線了。若它已離線,可能是 session 還留著,看起來像上線。
  • Kick Out 之後,同一台 client 又回連:如果該 client 用持久 session,中斷後會在 session 過期時間內重新連回同一 session。要「防它再回」,應改用 Authentication/ACL 或 Blacklist,而不是每次手動踢。
  • 訂了某主題卻收不到:在 Subscriptions 頁承認該訂閱的 QoS、No Local 有沒有被設錯。再用 Diagnose → WebSocket Client 的訂閱工具對同一主題抓一遍,確認 broker 有沒有在發。
  • 找不到 Slow Subscriptions 或 Topic Metrics:兩者是 Enterprise 版功能。若你是 Open Source 5.8.9,請改用 Clients /Subscriptions 的統計欄做簡易判斷。

常見問題

Clients 與 Sessions 有什麼差別

Clients 頁同時呈現「連線」與「會話」。連線斷的瞬間,session 未必跟著消失;如果該 client 是持久 session 並設定過期,session 會在到期前繼續存在。明細右上區的 Session Information 就是 session 的細項。

為什麼用 Kick Out 踢一台,它又自動連回

Kick Out 只是中斷連線,不是禁止重連。若 device 設定自動重連,就會在允許的 session 過期時間內回去。要多次拒絕某個 client,改考量 Blacklist 或 ACL 層面的阻擋。

Topics 清單與 Subscriptions 清單是不是一樣

不完全一樣。Subscriptions 以「client+topic」為一筆;Topics 是「全節去重」的主題名稱。同一主題若被兩台裝置訂了,Topics 只列一行,Subscriptions 卻會有兩筆。

慢訂閱統計與主題監控為什麼找不到

Slow Subscriptions 與 Topic Metrics 在 EMQX Enterprise 版才提供,Open Source 5.8.9 的 Diagnose 左欄不會顯示它們。若你的版是 Open Source,先以 Clients 的統計資訊做手動判斷。

官方來源