易君召
发布于 2026-08-06 / 作者:易君召 / 4 阅读
0

消息队列与 MQTT 协议在流量管理上的区别

先厘清概念:

  • 消息队列(MQ,如 RabbitMQ、RocketMQ、Kafka):一套完整中间件系统,包含协议 + 存储 + 队列 + 流量管控能力,多用于后端服务之间通信

  • MQTT:是应用层协议(专门面向 IoT 设备),本身只是协议,不自带存储,需要 Broker 实现;多用于设备 ↔ 平台通信

流量管理包含:消息推拉模式、流量削峰、限流、背压、消息堆积、带宽、QoS、重传、连接管理等维度。

核心对比表

维度

传统消息队列 (Kafka/RabbitMQ/RocketMQ)

MQTT 协议 (基于 MQTT Broker,EMQX/Mosquitto)

通信模型

服务端 ↔ 服务端;Pull / 推模式

Kafka:消费端主动 Pull;RabbitMQ 可推可拉

设备 ↔ 服务端,发布‑订阅 (Pub‑Sub),Broker 向订阅端推送;设备很少主动拉取

流量触发方式

业务主动生产消息,消费端按需拉取;流量由业务、消费速度共同决定

设备上报数据(发布),Broker 推送给订阅者;大量设备并发上报是主要流量来源

背压机制

原生支持背压:消费慢,消费端减少拉取请求,服务端暂缓投递,控制下游流量

协议层无原生背压;Broker 不停推送,订阅端处理不过来会消息积压、丢包,需要 Broker 侧缓存 / 限流 / 丢弃策略

限流粒度

按 Topic、队列、用户、连接、消费组;可限制生产速率、消费速率

粒度:连接级、客户端 ID、Topic;可限制单客户端发布速率、最大消息大小;设备数量巨大,连接数是首要流量压力

消息堆积 & 削峰

磁盘持久化,大量消息堆积,异步削峰,消费端慢慢消费,流量平滑

MQTT 协议本身没有持久化存储,靠 Broker 实现;QoS1/2 会话保存会缓存离线消息;内存压力大,堆积过大容易溢出,不能无限堆消息

QoS / 丢包策略

ACK 机制面向消费确认;丢消息属于异常,优先保存

协议内置 QoS0 (最多一次)/QoS1 (至少一次)/QoS2 (仅一次);弱网 IoT 场景,重传、心跳、遗嘱消息影响流量;网络差会产生大量重传流量

带宽特征

单条消息较大(业务报文),连接数少,单连接吞吐高;TCP 长连接 / 短连接均可

海量连接,单连接带宽极低;报文头极小(最小 2 字节),适合小报文;大量设备心跳包会带来高频小包流量

流量过载处理

消费跟不上:消息堆积磁盘,不会丢,延迟上升;可扩容消费组

订阅方过载:Broker 可配置丢弃旧消息、丢弃新消息、断开客户端;内存满直接丢消息,无法无限缓冲

离线流量

消费程序重启,重启后继续拉历史消息

设备离线,Broker 缓存离线消息(会话);设备上线瞬间爆发批量推送,产生上线风暴流量

流量控制手段

消费组、偏移量、分区、流控、重试队列、死信队列

心跳间隔、最大 QoS、消息过期、会话超时、连接限速、消息丢弃策略、黑名单

关键差异解读

1. 背压能力最大区别

  • 消息队列:背压在消费端

    消费处理不过来,就减少拉取请求,告诉服务端 “别发太快”,服务端把消息存磁盘,流量可控,不会把下游打垮。

  • MQTT 协议本身没有背压

    MQTT Broker 收到发布消息,只要客户端订阅,就尽可能推送。如果订阅服务处理慢,Broker 还会持续推送,直接压垮后端服务。

EMQX 这类 Broker 只能做:队列长度限制、溢出丢弃,不能通知发布端降速

2. 流量来源不一样

  1. 传统 MQ:少连接,高吞吐。几十 / 几百个服务实例,每个连接每秒成千上万消息,大报文。流量压力在磁盘 IO、CPU。

  2. MQTT:海量连接,小包高频。几十万、上百万 IoT 设备,每个设备每秒几条甚至几秒一条上报;大量心跳包、上线瞬间离线消息爆发(上线风暴),压力在连接管理、内存。

3. 削峰能力差异

  • Kafka/RocketMQ:磁盘存储,峰值流量全部落盘,消费慢慢追,削峰能力极强。

  • MQTT 协议本身不存储,依赖 Broker 内存缓存会话消息。如果峰值很大,内存很快打满,只能丢消息,削峰能力弱。

4. 重传带来额外流量

MQTT QoS1/QoS 在弱网下没有收到 ACK,会自动重发消息,网络抖动会带来额外重复流量;传统 MQ 重传由业务 / 消费逻辑控制,不会协议层自动疯狂重传。

实际工程问题

  1. MQTT 场景常见坑:设备批量上线,瞬间推送几万条离线消息,把后端 HTTP 服务打崩。传统消息队列不会出现这种上线风暴

  2. MQTT Broker 不能无限缓存消息,必须设置最大会话队列、消息 TTL;

  3. 如果 IoT 设备数据需要强大削峰堆积:一般架构:设备→MQTT Broker→转发到Kafka/RocketMQ,把流量交给传统消息队列做削峰。

简单总结

  1. 消息队列是系统:重点解决 “消费跟不上生产”,靠磁盘堆积、消费端背压实现流量管控,适合业务后端;

  2. MQTT 是协议:面向海量弱网设备,擅长海量小包、设备上下线;协议无背压,缓存能力有限,峰值过载容易丢消息;

  3. 工程上经常组合:MQTT 负责接入海量设备,再桥接到 Kafka/RocketMQ 做流量削峰、持久化。


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/message-queue-vs-mqtt-traffic-management-differences

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/