MQTT主題、通配符和最佳實踐

MQTT主題在MQTT生態系統非常重要,因為代理(broker)依賴主題確定哪個客戶端接收指定的主題。本文我們將聚集MQTT主題、MQTT通配符,詳細討論使用它們的最佳實踐,也會探究SYS主題,提供給代理(broker)本身的見解。

什么是MQTT主題及它們在消息過濾中的角色?

在MQTT中,主題,代理一個UTF-8編碼的字符串,為連接的客戶端過濾消息。一個主題由一或多個斜杠分割的層級組成。
在這里插入圖片描述

和消息隊列相比,MQTT主題是非常輕量級的。客戶端在發布或訂閱之前不需要創建期望的主題。代理(broker)接受合法的主題,不需要提前初始化。

MQTT主題例子

下面是一些MQTT主題例子:

  1. myhome/groundfloor/livingroom/temperature:這個主題代表一個家庭第一層起居室的溫度。
  2. USA/California/San Francisco/Silicon Valley:此主題層級結構可以跟蹤或交換與美國加得福尼亞舊金山的硅谷區域相關的事件或數據信息。
  3. 5ff4afdad-d324-fdaf-dfas-f2jaddjfjtd/status:這個主題可以用來監控一個被唯一標識符指定的設備或系統的狀態。
  4. Germany/Bavaria/car/34935932/latitude:此主題結構可用于共享德國巴伐利亞地區特定汽車的緯度坐標。

使用MQTT主題的最佳實踐

下面是一些使用MQTT主題的最佳實踐:

  • 每個主題必須包含至少一個字符。
  • 主題字符串可以包括空格,以允許更具可讀性或描述性的主題。
  • 主題是大小寫敏感的,意味著“myhome/temperature”和“MyHome/Temperature”是兩個不同的主題。
  • 斜杠本身就是一個有效的主題,可用于表示廣泛的主題或用作同時訂閱多個主題的通配符。

MQTT主題是MQTT代理(broker)和客戶端建立通信的關鍵。依據主題內容,能夠有效過濾和路由消息。在基于MQTT的系統中,確保高效交換、處理數據,合適的定義、組織主題至關重要。

MQTT通配符及主題訂閱中如何使用

在MQTT中,通配符提供了一種有力的機制來同時訂閱多個主題。當一個客戶端訂閱一個主題,它即可以訂閱已發布消息的確切的主題,也可以使用通配符來擴展它的訂閱。要注意的是,通配符只能用在訂閱上,而不能用在發布消息上。有兩類通配符:單層級和多層級。

單層級通配符:+

單層級通配符由+號表示,允許替換單個主題層級。通過訂閱一個使用單層級通配符的主題,將匹配任何包含任意字符串代替通配符的主題。
在這里插入圖片描述

比如,一個“myhome/groundfloor/+/temperature”的訂閱能產生以下結果:
在這里插入圖片描述

多層級通配符:#

多層級通配符覆蓋多個主題層級,由#號表示,必須放在主題字符的最后,前面有一個斜杠。
在這里插入圖片描述

當一個客戶端訂閱了使用多層級通配符的主題時,它會接收以通配符之前的模式開頭的主題的所有消息,無論主題的長度和深度。如果主題只有單獨的“#”,則該客戶端接收所有代理(broker)發送的消息。
在這里插入圖片描述

但是,重要的是要考慮到,如果期望高吞吐量,僅使用一個“#”進行訂閱可能是一種反模式。訂閱一個寬泛的主題會導致大量的消息被發送到客戶端,潛在的影響系統性能和帶寬使用。遵循優化主題訂閱最佳實踐,避免不必要的消息負載。

為什么及何時使用$開頭的主題

在MQTT中,主題命名靈活性很廣,允許你選擇符合需要的任何名稱。但是,有一個重要的例外需要注意:以$符號開頭的主題有專門的目的。使用多層級通配符(#)作為主題時,這些主題(以$開頭的)不包括在訂閱中。相反,以$開頭的主題保留用于MQTT代理(broker)的內部統計信息。
發布消息到以$開頭的主題是不被允許的,因為這些主題用來提供一些途徑給MQTT代理(broker)來暴露內部信息和統計給客戶端。但是,現在這些主題沒有官方標準,通常使用前綴$SYS/來表示此類信息,盡管代理(broker)的具體實現可能有所不同。
MQTT GitHub wiki中提供了用于理解$SYS主題的推薦資源。
下面是一些$SYS主題的例子和這些主題能夠提供的信息:

  1. $SYS/broker/clients/connected:指示當前連接到MQTT代理(broker)客戶端的數量。
  2. $SYS/broker/clients/disconnected:顯示從MQTT代理(broker)已斷開連接的客戶端數量。
  3. $SYS/broker/clients/total:代表所有和MQTT代理(broker)交互的客戶端的數量,包括連接的和斷開連接的。
  4. $SYS/broker/messages:提供MQTT代理(broker)發送的所有消息的數量。
  5. $SYS/broker/uptime:反映了MQTT代理(broker)持續運行的時間。

這些$SYS主題提供了有關MQTT代理(broker)內部工作和性能的寶貴信息,使管理員和開發人員能夠監控和分析關鍵統計信息。

通過理解以$開頭主題的目的和意義,就可以有效的更深入的了解MQTT基礎設施的行為和性能。

探究MQTT主題的動態性質

這些是MQTT主題的基礎,正如能看到的,MQTT主題是動態的,提供了很好的靈活性。當在現實應用中使用通配符時,有一些挑戰要注意。在重多廣泛使用MQTT的項目中,我們已經收集了請多最佳實踐。

MQTT最佳實踐

避免斜杠開頭

雖然MQTT允許主題以斜杠開頭(如何/myhome/groundfloor/temperature),但引入了一個不必要的主題級別,前面是一個零字符。會導致歧義,而沒有任何好處。所以,建議排除斜杠開頭。

在MQTT主題中不要使用空格

空格是每個程序員的天然敵人,主題中的空格可能會妨礙可讀性和調度,特別是在異常處理場景中。另外,UTF-8有許多不同的空格類型。在MQTT主題中,建議抵制使用空格和其他不常用在字符。

保持MQTT主題簡明扼要

記住,每個主題都被包含在使用它的每條消息中。為了優化網絡流量并節省寶貴資源,請使主題盡可能簡明扼要。在資源有限的設備中,會顯得特別重要,每個字節都被計算其中。

只使用ASCII字符,避免使用不可打印字符

為了確保主題的連貫性和明確性,建議使用ASCII字符。非ASCII的UTF-8字符可能會顯示異常,使識別拼寫錯誤或字符集相關總是變得難以處理。除非必要,在你的MQTT主題中避免使用非ASCII字符。

在主題里嵌入一個唯一標識符或客戶端ID

要增強消息標識并強制執行授權,考慮在主題中嵌入發布客戶端的唯一標識或客戶端ID。這樣,允許你確定消息的發送方,控制發布的權限。例如,有client1 ID的客戶端能夠發布消息到client1/status,而不是client2/status.

避免訂閱通配符#

有時候,訂閱所有通過代理(broker)的消息是有必要有。比如,為了將所有消息持久到數據庫。不要使用MQTT客戶端訂閱代理(broker)上的所有消息并訂閱多層級通配符。通常情況下,訂閱的客戶端無法處理所有消息的負載(尤其是在吞吐量很大的情況下)。

擁抱可擴展性

MQTT主題提供天然的靈活性,允許將來的擴展和新功能。考慮如何設計主題的結構能夠適應未來的擴展或新增傳感器或新增功能。設計主題以提高擴展性,而無需大幅更改整體主題層次結構。比如,如果你的智能家居方案增加了新的傳感器,添加這些到你的主題樹,而無需修改整體主題的層級,應該是可能的。

使用明確的主題,而不是能用的

區別你的主題來反映特定的數據流或實體。避免嘗試用一個主題代表多個類型的消息。比如,在你的起居室有三個傳感器,創建主題myhome/livingroom/temperatur,myhome/livingroom/brightness,myhome/livingroom/humidity,而不是使用一個類似myhome/livingroom的主題。這種做法提高了清晰度,并允許使用高級的MQTT功能,比如保留消息。后面文章中會詳細介紹。

文檔化

維護詳細說明MQTT主題的文檔,包括它們的目的、期望的消息負載和任何相關的約定和指導。有有助于擴展新的團隊成員,有利于更好的合作。

持續改進

根據需求的改進、MQTT系統的反饋,經常檢查、優化主題的結構。擁抱持續改進心態以確保高效且可擴展的MQTT通信。

安全

確保的你主題名稱和命名約定不會無意間泄漏敏感信息。應用合適的接入控制和認證機制來保護MQTT通信。

結論

在MQTT傳輸消息中,MQTT主題是高效性和靈活性的基石。通過理解其復雜性和最佳實踐,可以優化MQTT應用,為了最大化性能和擴展。
整篇文章,探究了MQTT主題的動態特性,深入通配符的使用、技術注意事項。討論了避免使用斜杠開頭和空格在主題中的重要性,使用ASCII字符和嵌入唯一標識符或客戶端ID。同樣強調了不要使用通配符訂閱所有的消息的重要性,在主題設計中擴展性的意義。
遵循這些最佳實踐,可以增加MQTT基礎設施的可讀性、可維護性和安全性。
接下來的文章中,會深入了解QoS

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209896.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209896.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【npm | npm常用命令及鏡像設置】

npm常用命令及鏡像設置 概述常用命令對比本地安裝全局安裝--save (或 -S)--save-dev (或 -D) 鏡像設置設置鏡像方法切換回npm官方鏡像選擇鏡像源 主頁傳送門:📀 傳送 概述 npm致力于讓 JavaScript 開發變得…

iOS——UIPickerView選擇器

UIPickerView UIPickerView是 iOS 開發中常用的用戶界面組件之一,用于在垂直方向上顯示一個滾動的列表,用戶可以通過滾動選擇其中的一項。 UIPickerView的協議方法 UIPickerView和UItableView差不多,UIPickerView也要設置代理和數據源。UI…

fl studio2024試用版本如何漢化中文?

fl studio2024全稱Fruity Loops Studio2024,這款軟件也被人們親切的稱之為水果,它是一款功能強大的音樂創作編輯軟件,擁有全功能的錄音室,大混音盤以及先進的音樂制作工具,用戶通過使用該軟件,就可以輕松制…

git上傳流程

git安裝網址:https://git-scm.com 如果您要將本地文件夾上傳到名為"compiling"的GitHub倉庫,可以按照以下步驟進行操作: 1.安裝無腦下一步 2.cd到想上傳的文件夾的上一級目錄 2.初始化Git倉庫:git init 設置分支&a…

C++特殊類設計

1.設計不能被拷貝的類 解析:拷貝只會放生在兩個場景中 拷貝構造函數賦值運算符重載 因此想要讓一個類禁止拷貝, 就需讓該類不能調用“拷貝構造函數”以及“賦值運算符重載”,而C11提供的delete重載關鍵字可以讓這件事情變得更加簡單。 1.1.C9…

stl庫之list鏈表與例題

stl中的list是雙向鏈表&#xff0c;優點在于插入/刪除元素方便&#xff0c;缺點是隨機訪問元素時間長 所需頭文件&#xff1a;#include <list> 初始化 list<類型名> 變量名 定義一個int類型的變量a list<int> a; 在末尾插入元素 a.push_back(i); 在開…

LeetCode 每日一題 Day 8 || 簡單枚舉

2048. 下一個更大的數值平衡數 如果整數 x 滿足&#xff1a;對于每個數位 d &#xff0c;這個數位 恰好 在 x 中出現 d 次。那么整數 x 就是一個 數值平衡數 。 給你一個整數 n &#xff0c;請你返回 嚴格大于 n 的 最小數值平衡數 。 示例 1&#xff1a; 輸入&#xff1a;n …

Error: Cannot find module ‘@npmcli/config‘ 最新解決辦法

看了網上許多這個問題的小伙伴&#xff0c;都是降級node版本來解決的。但是降級并不是我想要的結果。 真正的解決辦法就是更新nvm&#xff0c;將你的nvm升級到最新版本&#xff0c;然后卸載掉npm報錯的node版本&#xff0c;重新安裝即可使用。 解決辦法&#xff1a;更新nvm nv…

2020年第九屆數學建模國際賽小美賽B題血氧飽和度的變異性解題全過程文檔及程序

2020年第九屆數學建模國際賽小美賽 B題 血氧飽和度的變異性 原題再現&#xff1a; 脈搏血氧飽和度是監測患者血氧飽和度的常規方法。在連續監測期間&#xff0c;我們希望能夠使用模型描述血氧飽和度的模式。 ??我們有36名受試者的數據&#xff0c;每個受試者以1 Hz的頻率連…

【開源視頻聯動物聯網平臺】J2mod庫寫一個Modbus RTU 服務器

J2Mod是一個Java編寫的Modbus通信庫&#xff0c;可以用于實現Modbus RTU服務器。以下是一個簡單的示例&#xff0c;演示如何使用J2Mod庫創建一個Modbus RTU服務器&#xff1a; 添加J2Mod庫依賴項&#xff1a; 首先&#xff0c;確保在項目中包含J2Mod庫。你可以將J2Mod庫添加到…

CSPNet: A New Backbone that can Enhance Learning Capability of CNN(2019)

文章目錄 -Abstract1 Introduction2 Related workformer work 3 Method3.1 Cross Stage Partial Network3.2 Exact Fusion Model 4 Experiments5 Conclusion 原文鏈接 源代碼 - 梯度信息重用&#xff08;有別于冗余的梯度信息&#xff09;可以減少計算量和內存占用提高效率&am…

C語言 文件操作

文章目錄 前言文件概念文件名數據文件&程序文件文本文件&二進制文件文件緩沖區 文件操作FILE結構體文件指針文件打開&關閉文件輸入/輸出文件指針控制 前言 主要需要看的是概念部分、以及FILE結構體、文件指針部分。其余函數使用&#xff0c;知道其功能存在即可&am…

【SpringBoot】請求參數

1. BS 架構 BS架構&#xff1a;Browser/Server&#xff0c;瀏覽器/服務器架構模式。客戶端只需要瀏覽器&#xff0c;應用程序的邏輯和數據都存儲在服務端。 在SpringBoot進行web程序開發時&#xff0c;它內置了一個核心的Servlet程序 DispatcherServlet&#xff0c;稱之為 核…

EasyExcel之文件導出最佳實踐

文件導出 官方文檔&#xff1a;寫Excel | Easy Excel (alibaba.com) 引言 當使用 EasyExcel 進行 Excel 文件導出時&#xff0c;我最近在工作中遇到了一個需求。因此&#xff0c;我決定寫這篇文章來分享我的經驗和解決方案。如果你對這個話題感興趣&#xff0c;那么我希望這篇…

c語言插入排序算法(詳解)

插入排序是一種簡單直觀的排序算法&#xff0c;其主要思想是將一個待排序的元素插入到已經排好序的部分的合適位置。 插入排序的原理如下&#xff1a; 將序列分為兩部分&#xff1a;已排序部分和未排序部分。初始時&#xff0c;已排序部分只包含第一個元素&#xff0c;未排序…

php 接入 百度編輯器

按照github上的操作下載百度編輯器的包后&#xff0c;根據文檔上的步驟操作&#xff08;可能會遇到報錯&#xff09;&#xff1a; 1、git clone 倉庫 2、npm install 安裝依賴&#xff08;如果沒有安裝 grunt , 請先在全局安裝 grunt&#xff09; 我的是報了下面的錯&#…

Leetcode 17 電話號碼的字母組合

理解題意&#xff1a; 給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合 本質上&#xff1a;數字代表著一個字母集合 數字的個數決定了遞歸的深度&#xff0c;即樹的深度 數字代表的字母組合決定了當前樹的寬度。 1.暴力回溯 這里沒有什么剪枝…

387.字符串中的第一個唯一字符 —> `size()`

解答&#xff1a; int firstUniqChar(string s) {int size s.size();// char count[26] { 0 };// error.1int count[26] { 0 };// for (int i 0; i < s.size() - 1; i) // error.2for (int i 0; i < size; i){count[s[i] - a] 1;}for (int i 0; i < size; i){…

Android 幸運轉盤實現邏輯

一、前言 幸運轉盤在很多app中都有&#xff0c;也有很多現實的例子&#xff0c;不過這個難度并不是如何讓轉盤轉起來&#xff0c;真正的難度是如何統一個方向轉動&#xff0c;且轉到指定的目標區域&#xff08;中獎概率從來不是隨機的&#xff09;&#xff0c;當然還不能太假&…

AI全棧大模型工程師(二十二)什么是模型訓練

文章目錄 ?? 這節課會帶給你還是寫在前面Fine-Tuning 有什么用:先看一個例子我有很多問題一、什么是:二、什么是模型2.1、通俗(不嚴謹)的說、模型是一個函數:2.2、一個最簡單的神經網絡三、什么是模型訓練3.1、模型訓練本質上是一個求解最優化問題的過程3.2、怎么求解3.…