跳到主要内容
版本: 5.0

RocketMQ MQTT 概览

传统消息队列 MQ 主要用于服务(端)之间的消息通信,例如电商领域的交易消息、支付消息、物流消息等。然而,在消息的通用类别下,还有一个非常重要且常见的消息领域,即 IoT 终端设备消息。近年来,我们看到智能家居、工业互联带来的面向 IoT 设备的消息呈爆发式增长,而移动互联网移动 APP 端的消息,发展十几年,仍然是量级巨大的。终端设备的消息量级比传统服务器大多个数量级,并且仍在快速增长。

如果能有一个统一的消息系统(产品)提供多场景计算(如流式、事件)和多场景(IoT、APP)接入,这实际上是非常有价值的,因为消息也是重要的数据。只有一个系统,可以最大限度地降低存储成本,有效避免不同系统间数据同步造成的一致性问题和挑战。

image

基于此,我们引入了 RocketMQ-MQTT 扩展项目,旨在实现 RocketMQ 对 IoT 设备和服务器消息的统一接入,并提供一体化的消息存储和互通能力。

MQTT 协议介绍

在 IoT 终端场景中,MQTT 协议在业界被广泛采用。MQTT 起源于 IoT 环境,是一种基于发布/订阅(Pub/Sub)模型的轻量级消息传输协议,专门为低带宽和不可靠的网络环境设计。它最初由 IBM 开发,现在由 OASIS 联盟作为开放标准维护。MQTT 被广泛应用于 IoT、智能硬件、车联网、智慧城市、远程医疗、电力、石油与能源等领域。

其核心通信模型也是发布/订阅(Pub/Sub)——类似于 RocketMQ。但它在订阅模式上提供了更大的灵活性,支持多级主题订阅(例如,/t/t1/t2)和通配符订阅(例如,/t/t1/+)。通过 MQTT,您可以轻松实现消息广播、多播和单播。

RocketMQ MQTT 架构设计

RocketMQ MQTT 架构的目标是实现在不侵入 RocketMQ Broker 核心逻辑的情况下,实现消息存储和分发的统一管理,同时支持多协议集成。为此,我们设计了两种基本模型:队列存储模型和推拉模型。

队列存储模型

image

我们为多维分发设计了一个主题队列模型。如上图所示,消息可以来自各种接入场景(如服务器端的 MQ/AMQP 和客户端的 MQTT),但只有一份副本会被写入并存储在 commitlog 中,然后分发多个需求场景的队列索引(ConsumerQueue)。例如,服务器端场景(MQ/AMQP)可以根据一级 Topic 队列进行传统的服务器端消费,而客户端 MQTT 场景可以根据 MQTT 多级 Topic 和通配符订阅进行消费。

这样的队列模型可以同时支持服务器和终端场景的接入以及消息收发,实现一体化的目标。

推拉模型

image

上图展示了一个推拉模型。图中 P 节点为协议网关或 Broker 插件,终端设备通过 MQTT 协议连接到网关节点。消息可以来自多种场景(MQ/AMQP/MQTT)。消息存储到 Topic 队列后,会有一个通知逻辑模块实时感知新消息的到来,然后生成一个消息事件(即消息的主题名)。该事件被推送到网关节点,网关节点根据已连接终端设备的订阅状态进行内部匹配,找到哪些终端设备可以匹配,然后触发对存储层的拉取请求以读取消息并将其推送到终端设备。

架构概览

image 我们的目标是基于 RocketMQ 实现一个集成且自闭环的系统,但我们不希望 Broker 被更多场景逻辑侵入。我们抽象出一个协议计算层,它可以是一个网关或 Broker 插件。Broker 专注于解决队列问题,并进行一些队列存储适配或转换以满足上述计算需求。协议计算层负责协议接入,并且必须是可插拔和可部署的。