MQTT主题在MQTT生态系统非常重要,因为代理(broker)依赖主题确定哪个客户端接收指定的主题。本文我们将聚集MQTT主题、MQTT通配符,详细讨论使用它们的最佳实践,也会探究SYS主题,提供给代理(broker)本身的见解。
什么是MQTT主题及它们在消息过滤中的角色?
在MQTT中,主题,代理一个UTF-8编码的字符串,为连接的客户端过滤消息。一个主题由一或多个斜杠分割的层级组成。
和消息队列相比,MQTT主题是非常轻量级的。客户端在发布或订阅之前不需要创建期望的主题。代理(broker)接受合法的主题,不需要提前初始化。
MQTT主题例子
下面是一些MQTT主题例子:
- myhome/groundfloor/livingroom/temperature:这个主题代表一个家庭第一层起居室的温度。
- USA/California/San Francisco/Silicon Valley:此主题层级结构可以跟踪或交换与美国加得福尼亚旧金山的硅谷区域相关的事件或数据信息。
- 5ff4afdad-d324-fdaf-dfas-f2jaddjfjtd/status:这个主题可以用来监控一个被唯一标识符指定的设备或系统的状态。
- 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主题的例子和这些主题能够提供的信息:
- $SYS/broker/clients/connected:指示当前连接到MQTT代理(broker)客户端的数量。
- $SYS/broker/clients/disconnected:显示从MQTT代理(broker)已断开连接的客户端数量。
- $SYS/broker/clients/total:代表所有和MQTT代理(broker)交互的客户端的数量,包括连接的和断开连接的。
- $SYS/broker/messages:提供MQTT代理(broker)发送的所有消息的数量。
- $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