目录
本博文整理自论文《PrioMQTT: A prioritized version of the MQTT protocol》,由Gaetano Patti、Luca Leonardi、Giuseppe Testa和Lucia Lo Bello四位作者撰写,发表在《Computer Communications》期刊的2024年第220期上,页面范围是43-51页。
摘要
- MQTT是一个应用层协议,因其简单和低开销,在物联网(IoT)设备中广泛使用,特别是在家庭自动化和消费者应用中。
- MQTT的属性也使其成为工业物联网(IIoT)应用的有趣选择,但MQTT并非专为需要低延迟和时间受限传输的IIoT应用设计。
- 因此,本文提出了一个名为PrioMQTT的MQTT协议的IIoT版本,它能为时间关键的消息提供低延迟。
- 与标准MQTT不同,PrioMQTT采用UDP/IP堆栈,这比TCP/IP更适合低延迟通信。
- PrioMQTT引入了一种机制,优先处理时间关键消息而非非时间关键消息。
- PrioMQTT协议的UDP/IP堆栈和优先级支持的结合,同时保持与MQTT标准消息格式的兼容性。
- 因此,PrioMQTT可以在不需要硬件修改的现成商用设备上实现。
- 文章描述了PrioMQTT协议,并通过在现实工业场景中的评估以及与标准MQTT协议的比较来研究其性能。
第4部分论文详细介绍了PrioMQTT的设计,其主要目标是在消除TCP协议带来的额外延迟的同时,提供一种机制来区分消息传输的优先级,以反映消息的时间约束。以下是对第4部分的详细介绍:
4. 设计
4.1 引入消息优先级
- MQTT v5消息属性:PrioMQTT利用MQTT协议版本5引入的消息属性字段,在MQTT消息中编码特定的属性。这些属性包括用户属性(User Properties),它是一个UTF-8的键值对数组,允许在MQTT消息中包含用户指定的数据。
- 优先级编码:在PrioMQTT中,优先级被编码为一个包含数值的字符串,并将其转换为64位无符号整数。数值越低,优先级越高。这种设计允许支持不同的消息调度策略,如固定优先级或动态优先级。
4.2 代理(Broker)架构(图3)
- 网络栈:PrioMQTT代理的底部是网络栈,负责创建和管理代理的网络入口点。接收到的MQTT消息被传输到消息接收器和处理器组件。
- 消息接收器和处理器:该组件负责解析MQTT连接、订阅和MQTT协议的所有核心逻辑。它不处理传输协议,只处理标准MQTT消息。
- 定时器模块:用于管理时间驱动的操作,例如可能的重传和应用层连接的管理。
- Prio Tx队列:待传输的消息在此队列中按优先级排序。相同优先级的消息按照先进先出(FIFO)的顺序传输。
- 传输组件:从队列中提取消息并进行传输。
设计优势
- 兼容性:PrioMQTT允许在同一代理上结合标准MQTT传输和时间受限的传输,同时保持与标准MQTT客户端节点的向后兼容性。
- 多传输层:支持同时使用多个传输层,除了UDP,还可以选择其他协议,如音视频传输协议(AVTP)。
- 消息传输调度策略:可以使用不同的非抢占式消息传输调度策略。
- 降低延迟:通过为时间关键的传输采用UDP传输协议,减少了消息延迟。
设计考虑
- 消息优先级:发布者可以自由地将优先级分配给主题或每条消息,这种选择在网络设计时确定。
- 队列实现:Prio Tx队列在软件中实现,队列大小是一个可配置的参数,可以根据设备的工作负载和代理上可用的内存量进行设置。
- 多目的地传输:如果消息需要传输到多个目的地,可以采用两种不同的入队方法:一种是在队列中只存储一条消息和目标节点的地址数组;另一种是在同一消息的传输队列中存储多个引用,每个引用具有不同的目的地。