先厘清概念:
消息队列(MQ,如 RabbitMQ、RocketMQ、Kafka):一套完整中间件系统,包含协议 + 存储 + 队列 + 流量管控能力,多用于后端服务之间通信
MQTT:是应用层协议(专门面向 IoT 设备),本身只是协议,不自带存储,需要 Broker 实现;多用于设备 ↔ 平台通信
流量管理包含:消息推拉模式、流量削峰、限流、背压、消息堆积、带宽、QoS、重传、连接管理等维度。
核心对比表

关键差异解读
1. 背压能力最大区别
消息队列:背压在消费端
消费处理不过来,就减少拉取请求,告诉服务端 “别发太快”,服务端把消息存磁盘,流量可控,不会把下游打垮。
MQTT 协议本身没有背压
MQTT Broker 收到发布消息,只要客户端订阅,就尽可能推送。如果订阅服务处理慢,Broker 还会持续推送,直接压垮后端服务。
EMQX 这类 Broker 只能做:队列长度限制、溢出丢弃,不能通知发布端降速。
2. 流量来源不一样
传统 MQ:少连接,高吞吐。几十 / 几百个服务实例,每个连接每秒成千上万消息,大报文。流量压力在磁盘 IO、CPU。
MQTT:海量连接,小包高频。几十万、上百万 IoT 设备,每个设备每秒几条甚至几秒一条上报;大量心跳包、上线瞬间离线消息爆发(上线风暴),压力在连接管理、内存。
3. 削峰能力差异
Kafka/RocketMQ:磁盘存储,峰值流量全部落盘,消费慢慢追,削峰能力极强。
MQTT 协议本身不存储,依赖 Broker 内存缓存会话消息。如果峰值很大,内存很快打满,只能丢消息,削峰能力弱。
4. 重传带来额外流量
MQTT QoS1/QoS 在弱网下没有收到 ACK,会自动重发消息,网络抖动会带来额外重复流量;传统 MQ 重传由业务 / 消费逻辑控制,不会协议层自动疯狂重传。
实际工程问题
MQTT 场景常见坑:设备批量上线,瞬间推送几万条离线消息,把后端 HTTP 服务打崩。传统消息队列不会出现这种上线风暴。
MQTT Broker 不能无限缓存消息,必须设置最大会话队列、消息 TTL;
如果 IoT 设备数据需要强大削峰堆积:一般架构:
设备→MQTT Broker→转发到Kafka/RocketMQ,把流量交给传统消息队列做削峰。
简单总结
消息队列是系统:重点解决 “消费跟不上生产”,靠磁盘堆积、消费端背压实现流量管控,适合业务后端;
MQTT 是协议:面向海量弱网设备,擅长海量小包、设备上下线;协议无背压,缓存能力有限,峰值过载容易丢消息;
工程上经常组合:MQTT 负责接入海量设备,再桥接到 Kafka/RocketMQ 做流量削峰、持久化。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢