MQTT 核心概念
发布订阅
MQTT 基于发布订阅模式,它解耦了消息的发送方(发布者)和接收方(订阅者),引入了一个中间代理的角色来完成消息的路由和分发。
发布者和订阅者不需要知道彼此的存在,他们之间唯一的联系就是对消息的一致约定,例如消息将使用什么主题、消息将包含哪些字段等等。这让 MQTT 的通信更加灵活,因为我们可以随时动态地增加或减少订阅者和发布者。
通过发布订阅,我们可以轻易地实现消息的广播、组播和单播。
发布订阅的优势
- 解耦性:发布者和订阅者相互独立,无需直接通信
- 可扩展性:可以动态添加或移除发布者和订阅者
- 灵活性:支持一对多、多对多的消息传递模式
- 异步性:发布者和订阅者可以异步工作
服务端
在发布消息的客户端和订阅的客户端之间充当中介,将所有接收到的消息转发到匹配的订阅客户端。所以有时我们也会直接将服务端称为 Broker。
服务端的主要功能
- 消息路由:根据主题将消息转发给相应的订阅者
- 连接管理:管理客户端的连接和断开
- 会话管理:维护客户端的会话状态
- 安全控制:提供认证和授权机制
- 消息存储:存储保留消息和离线消息
客户端
使用 MQTT 协议连接到 MQTT 服务端的设备或应用程序。它既可以是发布者,也可以是订阅者,也可以具备这两种身份。
客户端的类型
- 发布者:只发布消息,不订阅主题
- 订阅者:只订阅主题,不发布消息
- 发布订阅者:既可以发布消息,也可以订阅主题
客户端的生命周期
- 连接:建立与 MQTT 服务端的连接
- 认证:进行身份验证
- 订阅:订阅感兴趣的主题
- 发布/接收:发布消息或接收订阅的消息
- 断开:断开与服务端的连接
主题
主题被用来标识和区分不同的消息,它是 MQTT 消息路由的基础。发布者可以在发布时指定消息的主题,订阅者则可以选择订阅自己感兴趣的主题来接收相关的消息。
主题的命名规则
- UTF-8 编码:主题名称使用 UTF-8 编码
- 层级结构:使用斜杠
/
分隔不同层级 - 长度限制:主题名称长度不能超过 65535 字节
- 大小写敏感:主题名称区分大小写
主题层级示例
sensor/temperature/room1
sensor/humidity/room1
device/status/machine1
home/lighting/livingroom
通配符
订阅者可以在订阅的主题中使用通配符来达到一次订阅多个主题的目的。MQTT 提供了单层通配符和多层通配符两种主题通配符,以满足不同的订阅需要。
单层通配符 +
- 匹配一个主题层级
- 必须占据整个层级
- 可以在多个层级中使用
示例:
sensor/+/temperature # 匹配 sensor/room1/temperature, sensor/room2/temperature
多层通配符 #
- 匹配任意数量的主题层级
- 必须是主题的最后一个字符
- 可以匹配零个或多个层级
示例:
sensor/# # 匹配 sensor, sensor/temperature, sensor/room1/temperature
QoS
MQTT 定义了三种 QoS 等级,来分别提供不同的消息可靠性保证。每条消息都可以在发布时独立设置自己的 QoS。
QoS 0 - 最多交付一次
- 特点:消息可能丢失,但不会重复
- 适用场景:对消息丢失不敏感的场景
- 性能:最高性能,最低延迟
QoS 1 - 至少交付一次
- 特点:消息保证到达,但可能重复
- 适用场景:需要保证消息到达的场景
- 性能:中等性能,需要确认机制
QoS 2 - 只交付一次
- 特点:消息保证到达,并且不会重复
- 适用场景:对消息可靠性要求最高的场景
- 性能:最低性能,需要四次握手
QoS 选择建议
- QoS 0:传感器数据、状态更新
- QoS 1:控制命令、重要通知
- QoS 2:关键配置、金融交易
会话
QoS 只是设计了消息可靠到达的理论机制,而会话则确保了 QoS 1、2 的协议流程得以真正实现。
会话类型
临时会话
- 特点:仅持续和网络连接一样长的时间
- 适用场景:不需要持久化的简单应用
- 优势:资源占用少,连接简单
持久会话
- 特点:跨越多个网络连接存在
- 适用场景:需要离线消息存储的应用
- 优势:支持离线消息,连接恢复
会话恢复
- Clean Session = true:创建新会话
- Clean Session = false:恢复已存在的会话
保留消息
与普通消息不同,保留消息可以保留在 MQTT 服务器中。任何新的订阅者订阅与该保留消息中的主题匹配的主题时,都会立即接收到该消息,即使这个消息是在它们订阅主题之前发布的。
保留消息的特点
- 持久化存储:消息保存在服务器中
- 即时获取:新订阅者立即收到最新消息
- 主题唯一性:每个主题只能有一条保留消息
- 自动覆盖:新保留消息会覆盖旧消息
保留消息的应用场景
- 设备状态:存储设备的最新状态
- 配置信息:存储系统配置参数
- 实时数据:存储传感器的最新读数
- 系统通知:存储重要的系统通知
遗嘱消息
发布订阅模式的特性决定了,除了服务器以外没有客户端能够感知到某个客户端从通信网络中离开。而遗嘱消息则为连接意外断开的客户端提供了向其他客户端发出通知的能力。
遗嘱消息的特点
- 自动触发:客户端异常断开时自动发送
- 可配置性:可以设置主题、内容、QoS 等
- 即时性:断开连接后立即或延迟发送
- 可靠性:确保重要状态信息被传递
遗嘱消息的应用场景
- 设备离线检测:监控设备连接状态
- 故障告警:设备故障时发送告警
- 状态同步:维护系统状态一致性
- 资源清理:释放离线设备占用的资源
共享订阅
默认情况下,消息会被转发给所有匹配的订阅者。但有时,我们可能希望多个客户端协同处理接收到的消息,以便以水平扩展的方式来提高负载能力。
共享订阅的特点
- 负载均衡:消息在订阅组内进行负载均衡
- 组隔离:不同订阅组之间相互独立
- 高可用性:支持客户端动态加入和离开
- 水平扩展:通过增加订阅者扩展处理能力
共享订阅的语法
- 带群组:
$share/{group}/{topic}
- 不带群组:
$queue/{topic}
共享订阅的应用场景
- 任务分发:将任务分发给多个工作节点
- 消息队列:实现类似消息队列的功能
- 负载均衡:提高消息处理能力
- 高可用性:提供故障转移能力
$SYS 主题
以 $SYS/
为前缀的主题被保留给服务器用来发布一些特定的消息,比如服务器的运行时间、客户端的上下线事件通知、当前连接的客户端数量等等。
系统主题的特点
- 服务器发布:由 MQTT 服务器自动发布
- 实时信息:提供服务器运行状态信息
- 监控数据:包含性能指标和统计信息
- 事件通知:客户端连接/断开事件
常见的系统主题
$SYS/broker/uptime # 服务器运行时间
$SYS/broker/clients/connected # 当前连接的客户端数量
$SYS/broker/clients/disconnected # 断开的客户端数量
$SYS/broker/messages/received # 接收的消息数量
$SYS/broker/messages/sent # 发送的消息数量
系统主题的应用
- 系统监控:监控服务器运行状态
- 性能分析:分析系统性能指标
- 告警通知:接收系统告警信息
- 运维管理:进行系统运维管理
总结
MQTT 核心概念构成了 MQTT 协议的基础,理解这些概念对于正确使用 MQTT 协议至关重要:
- 发布订阅模式提供了灵活的消息传递机制
- 主题和通配符实现了灵活的消息路由
- QoS 机制保证了不同级别的消息可靠性
- 会话管理确保了消息的可靠传输
- 保留消息提供了即时数据获取能力
- 遗嘱消息实现了设备状态监控
- 共享订阅提供了负载均衡和高可用性
- 系统主题提供了服务器监控能力
这些概念相互配合,构成了一个完整、灵活、可靠的 MQTT 消息传递系统。