MQTT 里其实没有消息队列:两字节协议如何撑起物联网
来源:dev.to — 2026-10-28
📋 概述
1999 年两位工程师要给美国西南沙漠里绵延数百公里的输油管道做监控,唯一可用的是一条脆弱、按千字节计费的卫星链路,远端传感器只有 8 位单片机和极小的内存缓冲。用 HTTP 的话,光是重复的明文头部每天就要烧掉几千美元带宽,一周内耗尽电池。于是他们设计了 MQTT。文章的核心纠错是:MQTT 名字里带 MQ,却根本不是队列——消息投递到主题而不是队列,broker 收到 PUBLISH 时查内存里的订阅树,有几个人订阅就复制几份沿 TCP 连接发出去,一个订阅者都没有就直接丢弃。唯一例外是持久会话下为指定 ClientId 缓存未确认的 QoS 1/2 消息。它真正省电的原因是二进制线格式:固定头最小只要两字节。
🔑 核心要点
- 名字里的 MQ 是个误会:MQTT 没有 FIFO 缓冲区,也不像 Kafka 存分区日志
- 消息是发到主题不是队列,无订阅者时 broker 当场丢弃,不存起来等明天
- 只有持久会话才会为特定 ClientId 缓存未确认的 QoS 1 和 QoS 2 消息
- 二进制固定头最小两字节,HTTP 发一个数字却要几百字节明文 ASCII
💡 金句
“If zero clients are subscribed, the broker discards the message immediately.”
译:如果一个订阅者都没有,broker 会立刻把这条消息丢弃。
← 返回 dev.to 首页