上家公司中前端项目有用MQTT协议和硬件通信的场景,虽然很早就听说过MQTT协议,但是这是第一次在前端项目里基于MQTT协议做网络通信。当时没了解太多,工作中只做好了代码层面的工作,并没有深入了解MQTT协议的好处和适合的应用场景。
在前端项目中,应该99%的情况都会基于HTTP
和WebSocket
来进行网络通信,使用MQTT
在前端里确实比较小众。
目前可能只会在物联网项目中,需要跟硬件通信的前提下,前端才会有MQTT
协议的选项。
我搜罗了一些资料来了解这样做的好处。
前端项目里,在绝大多数的情况下,业务场景都是去跟服务端通信,服务端理论上是可以无限扩展的。但是如果通信对象是一个设备参数固定的硬件,其实是不具备扩展能力的。
所以轻量级和低消耗很关键。
HTTP
协议是基于请求/响应的设计,每次请求都应该立即得到相应的响应,完整的【请求参数+响应结果】才算一次完整的通信。
WebSocket
协议是基于长连接且全双工通信的设计,通信的双方在建立长连接后,可以由任何一方进行消息的发送。
MQTT
协议在WebSocket
的长连接 + 全双工通信的基础上,使用了发布/订阅的模式。
MQTT
协议在设计上有一个订阅中心的概念,硬件设备其实从角色上来说跟前端一样,也是client
。
现在有一个前端A和一个前端B,都需要跟硬件C进行通信,接收硬件的统一消息。
如果是基于MQTT
协议,硬件C只需要把要发布的消息发给指定的Topic
,不需要跟接收者进行直接的交互。
前端A和前端B可以通过订阅指定Topic
来接受硬件C发布的消息。
这样理论上硬件C的消息可以发布给任何数量的前端。
反过来也是同理,因为硬件和前端都属于client
的角色
那如果这种场景用WebSocket
协议来做呢,硬件C就需要分别跟前端A和前端B建立长连接,然后将消息分发出来。而MQTT
协议中,硬件C只需要跟订阅中心建立关系,不需要管订阅中心分发给了多少client
。
在MQTT
协议中,QoS(服务质量) 是确保消息在不同网络环境下可靠传输的核心机制。它分为三个等级,从"尽力而为"到"绝对可靠",适应多种场景需求。
1. QoS 0:至多一次(At Most Once)
工作原理:
适用场景:
示例:
2. QoS 1:至少一次(At Least Once)
工作原理:
适用场景:
示例:
3. QoS 2:恰好一次(Exactly Once)
工作原理:
两阶段握手,确保消息既不丢失也不重复:
协议层自动处理去重,应用层无需额外逻辑。
适用场景:
示例:
MQTT
还有离线消息缓存,Broker可为断开连接的订阅者暂存消息(Clean Session=false),设备重连后补发。
QoS选择指南
维度 | QoS 0 | QoS1 | QoS2 |
---|---|---|---|
可靠性 | 可能丢失 | 必达但可能重复 | 必达且不重复 |
网络开销 | 最低 | 中等 | 最高 |
延迟 | 最低 | 中等 | 最高 |
适用设备 | 低功耗设备 | 常规设备 | 高可靠设备 |
HTTP:
WebSocket:
MQTT
在物联网场景下,以低开销、高可靠、易扩展等特性成为最优解,而其他协议更适用于侧重事务处理或简单通信的场景。
本文作者:CreatorRay
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!