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.mfbz.cn/a/231515.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超越极限!如何进行高效分布式性能测试,让Jmeter揭示并发下系统的真正实力

一、为什么要进行分布式性能测试 当进行高并发性能测试的时候,受限于Jmeter工具本身和电脑硬件的原因,无法满足我们对大并发性能测试的要求。 基于这种场景下,我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能测…

深度学习记录--激活函数

激活函数的种类 对于激活函数的选择,通常有以下几种 sigmoid,tanh,ReLU,leaky ReLU 激活函数的选择 之前logistic回归一直使用的激活函数都是sigmoid函数,但一般来说,tanh函数是比sigmoid函数更加好的选…

【小白专用】在 vs 中使用 nuget 安装NPOI

C#操作Excel有多种方法,如通过数据库的方式来读写Excel的OleDb方式,但是OleDb方式需要安装微软office,还可以通过COM组件方式操作Excel,也需要安装微软Excel。如果不想安装微软办公套餐可以使用ClosedXML、EPPlus、NPOI。本文主要…

理解IoC容器初始化

问题:当自己面试或者背诵八股文时,会背到各种各样的spring底层的东西,自己越看越迷糊。 OS:不知道兄弟们是不是也会这样?如果大家没有说明我太菜了。 原因:就是自己学的框架越来越多,很多框架…

线性回归实战

3.1 使用正规方程进行求解 3.1.1 简单线性回归 公式 : y w x b y wx b ywxb 一元一次方程,在机器学习中一元表示一个特征,b表示截距,y表示目标值。 使用代码进行实现: 导入包 import numpy as np import matp…

bc-linux-欧拉重制root密码

最近需要重新安装虚拟机的系统 安装之后发现对方提供的root密码不对,无法进入系统。 上网搜了下发现可以进入单用户模式进行密码修改从而重置root用户密码。 在这个界面下按e键 找到图中部分,把标红的部分删除掉,然后写上rw init/bin/…

JAVEE初阶 多线程基础(七)

懒汉模式 指令重排序问题 一. 懒汉模式的意义和代码实现二. 饿汉模式和懒汉模式的线程安全三. 懒汉模式的线程安全问题解决3.1 加锁阶段3.2 嵌套if阶段3.3 指令重排序问题3.4 解决线程安全问题阶段 一. 懒汉模式的意义和代码实现 在上一章节中,我们先学习了单例模式中的饿汉模式…

【好书推荐】《深入Activiti流程引擎:核心原理与高阶实战》

学习工作流,推荐贺老师的书《深入Activiti流程引擎:核心原理与高阶实战》,对系统学习和深入掌握Activiti/Flowable流程引擎的用法非常有帮助。 图书链接

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台,但是由于还没有拿到EVT。所以,就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后,充满剩余时间异常的问题。 问题描述,在充电过程中,显示充满时间为“0 min left unt…

基于EIoT能源物联网的智能照明系统应用改造-安科瑞 蒋静

【摘要】:随着物联网技术的发展,许多场所针对照明合理应用物联网照明系统,照明作为工厂的重要能耗之一,工厂的照明智能化控制,如何优化控制、提高能源的利用率,达到节约能源的目的。将互联网的技术应用到工…

MCS-51系列与AT89C5x系列单片机的介绍与AT系列的命名规则

MCS-51系列与AT89C5x系列单片机 主要涉及MCS-51系列与AT89C5x系列单片机的介绍与AT系列单片机的命名规则 文章目录 MCS-51系列与AT89C5x系列单片机一、 MCS-51系列单片机二、AT89C5x系列单片机2.1 AT89C5x/AT89S5x系列单片机的特点2.2 AT89系列单片机的型号说明2.2.1 前缀2.2.2…

PyTorch: 基于VGG16处理MNIST数据集的图像分类任务

引言 在本博客中,小编将向大家介绍如何使用VGG16处理MNIST数据集的图像分类任务。MNIST数据集是一个常用的手写数字分类数据集,包含60,000个训练样本和10,000个测试样本。我们将使用Python编程语言和PyTorch深度学习框架来实现这个任务。 在Conda虚拟环…

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组

🌈个人主页:聆风吟 🔥系列专栏:数据结构、剑指offer每日一练 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️寻找文件副本(题目难度:简单)1.1 题目1.2 示例1.3 限制1.4 解题思路一c代…

【链表OJ—分割链表】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1、分割链表题目: 方法讲解: 图文解析: 代码实现: 总结 前言 世上有两种耀眼的光芒,一种是正在升起的太…

坚鹏:中国工商银行浙江大学金融业务转型与场景营销策略培训

中国工商银行打造D-ICBC数字化转型战略,围绕“数字生态、数字资产、数字技术、数字基建、数字基因”五维布局,深入推进数字化转型,加快形成体系化、生态化实施路径,促进科技与业务加速融合,以“数字工行”建设推动“GB…

【父子进程/AES/XTEA/SMC】赛后复盘

官方wp: 进程重影技术: 进程重映像利用了Windows内核中的缓存同步问题,它会导致可执行文件的路径与从该可执行文件创建的映像节区所报告的路径不匹配。通过在一个诱饵路径上加载DLL,然 后卸载它,然后从一个新路径加载它&#x…

SQL语言重温

数据库语言重温 笔记背景SQL教程一些最重要的 SQL 命令SQL WHERE 子句SQL AND & OR 运算符SQL ORDER BY 关键字 笔记背景 由于工作需要,现重温简单SQL语言,笔记记录如下。 SQL教程 SQL(Structured Query Language:结构化查询语言&…

网络安全渗透测试

针对网络的渗透测试项目一般包括:信息收集、端口扫描、指纹识别、漏洞扫描、绘制网络拓扑、识别代理、记录结果等。下面就一一介绍。 信息收集 DNS dns信息包含(A, MX, NS, SRV, PTR, SOA, CNAME) 记录,了解不同记录的含义至关重要。 A 记录列出特定…

【Java】构建表达式二叉树和表达式二叉树求值

问题背景 1. 实现一个简单的计算器。通过键盘输入一个包含圆括号、加减乘除等符号组成的算术表达式字符串,输出该算术表达式的值。要求: (1)系统至少能实现加、减、乘、除等运算; (2)利用二叉…

C++ 运算符重载与操作符重载

目录 运算符重载 运算符重载的特性 其他运算符重载的实现 默认成员函数——赋值运算符重载 默认成员函数——取地址操作符重载 const成员 附录 运算符重载 C为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回…
最新文章