MQTT的面试题通常都很有章法,主要围绕其作为物联网"通用语言"的核心特性展开。面试官会从基础概念逐步深入到协议细节和实战经验。
为了让你准备起来更清晰,我按照考察的侧重点把常见问题分了类,并附上了解题思路。
📚 第一部分:基础与概念
这类问题主要考察你对MQTT本质和核心组成是否了解。
-
💬 什么是MQTT?它的设计初衷和主要特点是什么?
- 解题思路 :这是一道"自我介绍"题。MQTT (Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅 模式的轻量级消息传输协议。它专为受限环境和低带宽、高延迟、不稳定的网络而设计,核心特点包括轻量高效、支持三种QoS级别、异步通信、持久会话和遗愿消息等。
-
💬 MQTT协议的核心组成部分有哪些?它们是如何协同工作的?
- 解题思路 :回答要抓住 "发布者-代理-订阅者" 这个铁三角。发布者 (Publisher) 是消息的发送方,订阅者 (Subscriber) 是消息的接收方,它们都无需知道对方的存在。中间的代理 (Broker) 是中枢,负责接收、路由和转发消息。这种设计实现了发送方和接收方的完全解耦,极大地提升了系统的扩展性。
-
💬 MQTT 3.1.1 和 5.0 版本有哪些主要区别?
- 会话机制升级 :3.1.1 用
Clean Session标志(true/false);5.0 拆分为Clean Start(决定是否全新开始)和Session Expiry Interval(可精确控制会话保留时长,单位秒)。
- 会话机制升级 :3.1.1 用
-
增加"原因码" :3.1.1 仅用简单的确认包(如
ACK);5.0 在每个响应报文中加入原因码(Reason Code),能详细说明失败原因(例如"不支持QoS"、"主题不存在"等)。 -
支持属性(Properties) :3.1.1 报文头固定;5.0 在可变头部引入可扩展的属性字段,支持如消息过期间隔 、主题别名 、用户属性(类似HTTP Header)等。
-
共享订阅 :3.1.1 一个消息会发给所有匹配的订阅者;5.0 引入
$share/{GroupName}/Topic格式,实现订阅组内负载均衡(一条消息只发给组内一个客户端)。 -
请求-响应模式 :5.0 原生支持,可通过
Response Topic和Correlation Data属性实现双向通信。 -
增强的错误处理和流控 :5.0 增加
Receive Maximum限制未确认消息数量,以及Topic Alias减少主题字符串开销。
⚙️ 第二部分:核心功能与机制
这部分是MQTT的"灵魂",面试必考。
-
💬 什么是Topic?它的结构如何?MQTT的通配符(
+和#)如何使用?- 解题思路 :可以把它看作邮件的收件地址,是一个用正斜杠(
/)分隔的UTF-8字符串(如home/livingroom/temperature)。然后重点介绍通配符:+(单层通配符) :匹配当前层级下的任意一个节点。例如订阅home/+/temperature,会收到所有房间的温度数据,但不会匹配home/livingroom/air/temperature。#(多层通配符) :匹配当前层级及其后的所有子节点,且必须放在Topic的最后。例如订阅home/#,会收到home下所有层级的所有消息。
- 解题思路 :可以把它看作邮件的收件地址,是一个用正斜杠(
-
💬 MQTT的三种QoS级别(0, 1, 2)分别是什么?各自适用于什么场景?
- 解题思路 :这是高频核心题,需要清晰对比阐述。
- QoS 0 (最多一次):发完即忘,可能丢失。用于传感器数据等允许少量丢失的场景。
- QoS 1 (至少一次):通过发送与确认(PUBACK)保证送达,但可能重复。用于计费、日志等不能丢但可接受重复的场景。
- QoS 2 (恰好一次):通过四次握手保证不丢失不重复,开销最大。用于金融交易、关键控制指令等不允许任何差错的场景。
- 解题思路 :这是高频核心题,需要清晰对比阐述。
-
💬 什么是持久会话?它与清除会话有何不同?
- 解题思路 :持久会话的核心是Broker记住"过去"。在客户端连接时通过
Clean Session标志(MQTT 3.1.1)或Clean Start与Session Expiry Interval(MQTT 5.0)控制。设置为false时,Broker会保留会话状态,确保设备断网重连后能继续接收离线期间的消息。
- 解题思路 :持久会话的核心是Broker记住"过去"。在客户端连接时通过
-
💬 什么是遗愿消息?它的作用是什么?
- 解题思路 :可以把它比喻成设备的"最后遗言"。客户端在连接时预设一条"遗愿",当Broker检测到其异常断开时,就会自动发布这条消息,用于通知其他设备或系统。常见的应用是设备离线的实时告警和状态更新。
🔬 第三部分:协议细节与深度原理
这部分问题旨在考察你对MQTT理解的深度,是区分经验丰富的开发者与新手的关键。
-
💬 请描述MQTT协议栈的四层架构,并解释其核心职责。
- 解题思路 :MQTT协议栈分为四个逻辑层:应用层 (处理发布/订阅、主题路由、消息回调)-> 协议层 (负责报文序列化、QoS机制、心跳保活)-> 传输层 (管理TCP连接、处理网络字节序和重传超时)-> 系统层(处理线程调度、内存管理、定时器服务)。
-
💬 在QoS 1模式下,如果PUBACK包丢失,客户端会怎么做?
- 解题思路 :这是一个经典难题。QoS 1的可靠性依赖于接收方回复的
PUBACK包。如果发送方在超时时间内没收到PUBACK,就会重新发送 该消息。因此,这可能导致消息重复,接收方必须做好幂等处理。
- 解题思路 :这是一个经典难题。QoS 1的可靠性依赖于接收方回复的
-
💬 MQTT Broker如何高效地将消息路由给订阅者?
- 解题思路 :Broker内部维护一个主题树(Topic Tree) ,发布的消息到达后,Broker会基于这个树结构进行主题匹配(Topic Matching),高效查找所有匹配该主题的订阅者,然后并行推送。
-
💬 MQTT协议在传输层使用TCP,如果网络出现"半开连接"该如何处理?
- 解题思路 :网络异常时可能出现TCP半开连接(一方关闭而另一方不知)。MQTT的Keep Alive机制 正是为解决此问题而设计的。设备有需在Keep Alive时间内发送心跳请求
PINGREQ,Broker回复PINGRESP。若Broker超时未收到心跳,则会断开连接,触发遗愿消息的发布。
- 解题思路 :网络异常时可能出现TCP半开连接(一方关闭而另一方不知)。MQTT的Keep Alive机制 正是为解决此问题而设计的。设备有需在Keep Alive时间内发送心跳请求
🔐 第四部分:安全与性能
-
💬 MQTT有哪些安全措施?
- 解题思路 :MQTT的安全性应从网络层、认证层、应用层 三个层面来构建。
- 网络层 :使用TLS/SSL加密通信。
- 认证层 :使用用户名/密码 或更安全的客户端证书进行身份验证。
- 应用层 :配置ACL(访问控制列表) 来精细控制客户端对特定主题的发布与订阅权限。
- 解题思路 :MQTT的安全性应从网络层、认证层、应用层 三个层面来构建。
-
💬 如何防止MQTT Broker消息堆积?
- 解题思路 :这是一个考察系统设计能力的题。答法如下:
- 客户端优化:确保客户端消费能力充足,合理设置QoS,并使用acknowledgement机制及时确认。
- Broker配置:合理设置Broker的接收队列大小,并启用消息持久化以防止内存溢出。
- 监控与告警 :关键措施。建立监控体系,实时跟踪消息堆积情况。
- 解题思路 :这是一个考察系统设计能力的题。答法如下:
🏗️ 第五部分:实战与架构
这部分考察的是你的综合运用能力和解决问题的能力。
-
💬 MQTT协议与HTTP协议在物联网场景下有哪些主要区别?
- 解题思路 :这道题可以从几个关键维度对比:
- 通信模式 :MQTT是发布/订阅 ,HTTP是请求/响应。
- 协议开销 :MQTT协议头仅2字节,非常轻量,而HTTP头部冗长。
- 适用场景 :MQTT适用于低带宽、高延迟的物联网环境 ;HTTP适用于稳定、高带宽的Web浏览/REST API。
- 连接模型 :MQTT是长连接 ;HTTP/1.0是短连接,HTTP/1.1虽支持长连接,但本质仍是请求/响应模型。
- 实时性 :MQTT是异步、实时 推送;HTTP是同步、请求驱动。
- 解题思路 :这道题可以从几个关键维度对比:
-
💬 在项目中,如果遇到消息丢失或乱序,你会如何排查和解决?
- 解题思路 :先系统排查问题根源,再针对性解决。
- 初步定位 :逐层检查网络是否稳定、Broker日志有无异常、客户端连接配置(如
keepAlive)。 - 针对解决 :检查QoS 是否设置过低;检查持久会话 是否未启用导致离线消息丢失;检查业务代码并发处理逻辑,并在应用层添加序列号 实现消息重排;使用消息ID去重 确保幂等性。
- 初步定位 :逐层检查网络是否稳定、Broker日志有无异常、客户端连接配置(如
- 解题思路 :先系统排查问题根源,再针对性解决。
💡 面试准备小贴士
扎实地掌握以上问题,足以应对大部分MQTT相关的面试。在准备时,结合你自己的项目经历,思考一下实际遇到过哪些和MQTT相关的问题,又是如何解决的,这往往能成为面试中的亮点。祝你面试顺利!