初识 MQTT(1)

162 阅读4分钟

MQTT协议简介1

MQTT 是一种基于发布/订阅模式的轻量级消息传输协议,可以用极少的代码为联网的设备提供实时可靠的消息传输服务,是专门为低带宽和不稳定网络环境的物联网应用设计的。发发多少

MQTT 与 HTTP 对比

  • MQTT 的最小报文仅为 2 个字节,比 HTTP 占用更少的网络开销。
  • MQTT 与 HTTP 都能使用 TCP 连接,并实现稳定、可靠的网络连接。
  • MQTT 基于发布订阅模型,HTTP 基于请求响应,因此 MQTT 支持双工通信。
  • MQTT 可实时推送消息,但 HTTP 需要通过轮询获取数据更新。
  • MQTT 是有状态的,但是 HTTP 是无状态的。
  • MQTT 可从连接异常断开中恢复,HTTP 无法实现此目标。

MQTT具备以下几个特点

  • 简单容易实现
  • 轻量且省带宽(因为那时候带宽很贵)
  • 可靠的消息传输,支持 QoS(设备网络环境复杂)
  • 支持海量连接
  • 支持安全的双向通信
  • 在线状态感知(时刻知道设备是否在线)
  • 数据无关(不关心 Payload 数据格式)

轻量且省带宽

MQTT 将协议本身占用的额外消耗最小化,消息头部最小只需要占用 2 个字节,可以稳定运行在带宽受限的网络环境下。而且 MQTT 客户端只需占用非常小的硬件资源,能运行在各种资源受限的边缘端设备上。

可靠的消息传输

MQTT 协议提供了 3 种消息服务质量等级(Quality of Service),保证了在不同的网络环境下消息传递的可靠性。

  • QoS 0:消息最多传递一次。

    如果当时客户端不可用,则会丢失该消息。发布者发送一条消息之后,就不再关心它有没有发送到对方,也不设置任何重发机制。

  • QoS 1:消息传递至少 1 次。

    包含了简单的重发机制,发布者发送消息之后等待接收者的 ACK,如果没收到 ACK 则重新发送消息。这种模式能保证消息至少能到达一次,但无法保证消息不重复。

  • QoS 2:消息仅传送一次。

    设计了重发和重复消息发现机制,保证消息到达对方并且严格只到达一次。

支持海量连接(Mria + RLOG 架构)

MQTT 协议在设计的时候就考虑到了需要支持海量的物联网设备连接。目前,MQTT 服务器中支持并发连接数最多的是 EMQX。最近发布的 EMQX 5.0 通过一个 23 节点的集群达成了 1 亿 MQTT 连接,以及每秒 100 万消息吞吐。

支持安全的双向通信

依赖于发布订阅模式,MQTT 允许在设备和云之间进行双向消息通信。发布订阅模式的优点在于:发布者与订阅者不需要建立直接连接,也不需要同时在线,而是由消息服务器负责所有消息的路由和分发工作。

安全性方面,MQTT 支持通过 TLS/SSL 确保安全的双向通信,同时 MQTT 协议中提供的客户端 ID、用户名和密码允许我们实现应用层的身份验证和授权。

在线状态感知

为了应对网络不稳定的情况,MQTT 提供了心跳保活(Keep Alive)机制。在客户端与服务端长时间无消息交互的情况下,Keep Alive 保持连接不被断开,若一旦断开,客户端可即时感知并立即重连。

同时,MQTT 设计了遗愿(Last Will) 消息,让服务端在发现客户端异常下线的情况下,帮助客户端发布一条遗愿消息到指定的 MQTT 主题。

另外,部分 MQTT 服务器如 EMQX 也提供了上下线事件通知功能,当后端服务订阅了特定主题后,即可收到所有客户端的上下线事件,这样有助于后端服务统一处理客户端的上下线事件。