MQTT 与 AMQP:物联网通信协议对比
目录
随着物联网的迅猛发展,管理设备和系统之间的通信变得越来越重要。物联网通信通常依靠消息队列协议来实现,这些协议能够以有序高效的方式实现信息交换。
MQTT 协议(Message Queuing Telemetry Transport)和 AMQP 协议(Advanced Message Queuing Protocol)是两种在物联网中广泛使用的协议。本文将详细介绍这两种协议,阐明它们的主要区别,以及在选择它们时需要考虑的因素。
物联网和分布式系统中消息队列协议的重要性
在物联网中,各种设备,无论是简单的传感器还是复杂的机器,都需要与彼此和中心系统进行通信。这些设备通常在资源有限的环境中运行,例如低功耗或不稳定的网络。像 MQTT 这样的消息队列协议,就是为这样的场景而设计的,它能够让这些设备高效可靠地通信。
在分布式系统中,组件之间需要在保持松耦合的基础上交换信息。AMQP 这类协议拥有强大的功能和复杂的路由能力,为这种场景提供了可靠的通信方式。这些协议能够保证消息被准确地传输,并且系统可以独立地扩展和演进。
什么是 MQTT?
MQTT 是一种轻量级的发布/订阅模式的消息传输协议,由 IBM 在 1999 年推出。它专为资源有限的设备和低带宽、高延迟或不稳定的网络而设计,非常适合需要小代码占用的应用场景(例如,机器之间通信或物联网)。
MQTT 基于发布/订阅模式,在这种模式下,生产者(也称为发布者)创建信息,消费者(也称为订阅者)接收信息。发布者和订阅者之间的交互由 Broker 管理。Broker 负责将消息从发布者分发给订阅者。
MQTT 的简单之处在于其协议命令很少。它只有几个命令,因此很容易在各种设备和系统中实现。此外,它的服务质量等级可以保障消息传输的可靠性,避免消息在传输过程中丢失。下面让我们来详细了解一下 MQTT。
相关内容请阅读我们的文章:物联网中的 MQTT 协议
MQTT 传输和帧
MQTT 可以使用 TCP、TLS、WebSocket 或 QUIC 作为传输层,在客户端和 Broker 之间创建连接、建立会话并可靠地传输信息。
MQTT 帧由一个 2 字节的固定头部、一个可变头部和一个长度可变的有效载荷组成。头部包含报文类型、服务质量等级、剩余长度、报文 ID 和属性等信息。有效载荷是二进制格式的,包含了要传输的实际消息内容。
根据 5.0 版协议规范中的二进制帧,MQTT 定义了 15 种控制报文。其中,用于连接、发布和订阅的常用报文包括 CONNECT、CONACK、PUBLISH、PUBACK 和 SUBSCRIBE。
MQTT QoS
MQTT 支持三种不同的消息传输服务质量:
QoS0 “最多一次”:消息的传输依赖于网络环境,可能出现消息丢失的情况。
QoS1 “至少一次”:消息保证能够到达,但可能出现重复。
QoS2 “正好一次”:消息保证只到达一次,不会出现重复或丢失的情况。
MQTT 的优缺点
优点
简单:采用最简单的发布-订阅模式,便于配置、开发和管理。
轻量和高效:MQTT 消息只有 2 字节的头部开销,节省带宽资源。这使得该协议非常适合低功耗、低带宽的设备。
扩展性强:能够支持千万级的 MQTT 连接、主题和订阅。
消息传输可靠:提供三种服务质量等级,保证在不稳定的网络环境下也能可靠地传输消息。
低延迟:由于采用简单的基于主题的发布/订阅模型,实现了近乎实时的消息传输,延迟仅为个位数毫秒级。
安全:支持通过 TLS/SSL 或 QUIC 进行安全通信,并提供 LDAP、JWT、PSK 和 X.509 证书等多种认证方式。
兼容性和集成性强:可以与多种编程语言、操作系统和软件平台兼容和集成。
缺点
- MQTT 缺少存储转发队列功能。
什么是 AMQP?
AMQP 是一种支持多种消息模式并具有强大功能集的协议。它由摩根大通于 2003 年创建,专为需要高可靠性和复杂功能的系统而设计。
与 MQTT 不同,AMQP 是一种点对点协议,可以实现生产者和消费者之间的直接通信。
AMQP 采用的模式是将消息发送到交换机(Exchange),交换机再根据绑定规则把消息路由到相应的队列。然后,消费者再从队列中检索消息。这种模式支持复杂的路由和分发策略,使 AMQP 适用于复杂的分布式系统。
AMQP 的优势在于其丰富的功能集。它支持多种消息属性和传输模式,包括持久化消息,可确保即使 Broker 重新启动,消息也不会丢失。
要了解更多关于 AMQP 的内容,请参阅我们即将推出的详细指南
AMQP 交换机和绑定
在 AMQP 中,交换机就像一个电子邮件传输代理,负责检查电子邮件,并根据路由键和表来决定如何将电子邮件发送到一个或多个邮箱。路由键相当于一个带有收件人、抄送或密送地址的电子邮件,但不包含服务器信息(路由只在 AMQP 服务器内部进行)。绑定就像是电子邮件传输代理的路由表中的一个条目。
AMQP 定义了四种类型的交换机:
直接(点对点):消息直接发送给绑定到交换机的指定队列。
扇出:消息发送给绑定到交换机的所有队列。
主题(发布-订阅):消息根据路由键和交换机绑定的模式发送到相应的队列。
头部(发布-订阅):消息根据消息头部的匹配规则发送到相应的队列。
AMQP 传输和帧
AMQP 是一种基于 TCP/IP 的二进制协议,它在客户端和 Broker 之间建立可靠的、持久的、面向流的连接。一个单一的套接字连接上可以创建多个信道,实现多个数据流的同时传输。
AMQP 1.0 版本中的帧由一个 8 字节的固定头部、一个可选的扩展头部和一个长度可变的二进制有效载荷组成。固定头部包含了帧类型、信道号和有效载荷大小的信息。有效载荷包含了要传输的实际消息,以及相关的元数据。
AMQP 的优缺点
优点
支持存储转发队列:AMQP 支持存储转发队列,但相对于 MQTT 而言,牺牲了一些效率并增加了一些复杂度。
灵活的消息路由:AMQP 提供多种消息路由方式,包括点对点、发布-订阅和扇出。
安全:AMQP 支持 TLS 和 SASL 等加密和认证安全机制。
成熟的生态系统:AMQP 生态系统拥有丰富而成熟的开源服务器实现和客户端库,覆盖多种编程语言。
缺点
复杂:AMQP 的模型涉及了许多概念,可能不太容易理解、配置和管理。
重量级:AMQP 在传输层通过“信道”实现了多路复用。而且每个 AMQP 帧都有 8 字节的头部开销。
向后兼容性差:AMQP 的最大问题是 0.9.1 版本和 1.0 版本完全不兼容,增加了解决方案的复杂度。
可扩展性和性能受限:AMQP 在一些场景中可能受到可扩展性和性能的限制。这是由于其架构相对于轻量级协议如 MQTT 而言,引入了更多的复杂性和开销。
MQTT 与 AMQP 的详细对比
下表对 AMQP 和 MQTT 进行了详细的对比。
AMQP | MQTT | |
---|---|---|
英文全称 | Advanced Message Queuing Protocol | Message Queueing Telemetry Transport |
起源 | 由摩根大通于 2003 年发明 | 由 IBM 于 1999 年发明 |
架构 | EBQ(交换机-绑定-队列) | 基于主题的发布/订阅 |
核心概念 | 交换机,队列,绑定,路由键 | 主题,订阅 |
主要协议版本 | · 0.9.1 于 2008 年 11 月发布 · 1.0 于 2012 年 10 月发布 | · 3.1.1 于 2015 年 12 月发布 · 5.0 于 2019 年 3 月发布 |
消息范式 | ||
点对点 | ✅ (存储转发队列) | 部分支持 |
发布/订阅 | ✅ | ✅ |
扇出 | ✅ | ✅ 可扩展性更强 |
扇入 | ✅ | ✅ |
请求/响应 | ✅ | ✅ 在 5.0 版本中支持 |
推/拉 | ❌ | ❌ |
传输 | ||
TCP | ✅ | ✅ |
TLS/SSL | ✅ | ✅ |
WebSocket | ❌ | ✅ |
QUIC | ❌ | ✅ |
帧 | ||
帧结构 | 帧分为三个不同的区域:固定长度的帧头部,可变长度的扩展头部,可变长度的帧体。 | MQTT 控制报文由最多三部分组成:固定头部,可变头部,有效载荷。 |
固定头部大小 | 8 字节 | 2 字节 |
有效载荷内容 | 二进制 | 二进制 |
最大有效载荷大小 | 2GB | 256MB |
传输 | ||
QoS 0: 最多一次 | ✅ | ✅ |
QoS 1: 至少一次 | ✅ | ✅ |
QoS 2: 正好一次 | ❌ | ✅ |
安全性 | SSL/TLS | SSL/TLS |
选择 MQTT 和 AMQP 时需要考虑的因素
在 MQTT 和 AMQP 两者之间做选择时,有几个因素需要考虑。
基于用户场景的评估
选择 MQTT 或 AMQP 主要取决于用户场景的需求。如果您要处理资源有限的设备或不稳定的网络,MQTT 凭借其轻量级的特性可能是更佳的选择。如果您的用户场景需要复杂的路由和高可靠性,那么 AMQP 会更适合。
基于系统架构的评估
系统架构也会影响决策。MQTT 的简单性使其成为具有清晰简单通信模型的系统的理想选择。AMQP 凭借其灵活性和强大的功能集,更适合具有多样化通信需求的复杂系统。
基于网络条件的评估
网络条件是另一个重要因素。MQTT 在低带宽、高延迟或不可靠的网络中表现优异。相反,AMQP 由于其较高的开销,需要稳定的网络连接。
基于所需服务质量的评估
MQTT 提供了三个级别的服务质量,可灵活保证消息的传输。AMQP 通过其持久化消息功能,可确保消息传输的高可靠性。
总之,MQTT 和 AMQP 各有优势,适合不同的应用场景。在选择 MQTT 和 AMQP 时,了解它们的主要区别,并根据这些区别评估需求,将有助于您做出明智的决定。请记住,正确的选择取决于您的具体需求和限制条件。
使用 EMQX 实施大规模 MQTT 场景
EMQX 是最具可扩展性的 MQTT 消息传输平台,专为高性能、可扩展性和容错性而设计。EMQX 能够让大规模的物联网设备彼此通信,并支持与边缘服务器和云应用无缝集成。
EMQX 提供了以下功能来支持大规模的 MQTT 连接和消息路由:
集群架构:EMQX 采用分布式集群架构,可以创建互联的节点网络。集群中的每个节点都负责处理 MQTT 连接和消息传输,使其具备强大的水平扩展能力,能够应对连接设备和消息数量的快速增长。
负载均衡:EMQX 集群通过负载均衡将 MQTT 流量分配到各个节点。这可确保不会出现单个节点过载的情况,从而有效处理大量连接。
动态消息路由:它支持在运行时创建大量主题和订阅,从而能够动态路由和转发消息。
快速可靠的数据传输:它提供了多种消息传输服务质量等级,以及持久化会话和离线消息队列等特性,确保在不稳定的网络中也能快速可靠地传输数据。
高性能和低延迟:集群能够以低至 1 毫秒的延迟传输百万级的消息,为延迟敏感型物联网业务场景提供基础能力支持。
低代码实时数据处理:EMQX 提供了基于 SQL 语句的内置强大规则引擎,可实现一站式物联网数据提取、过滤和转换,无需编写代码。
一站式企业系统集成:通过 EMQX 提供的规则引擎和数据桥接功能,您可以通过可视化界面轻松配置物联网数据与 40 多种企业系统(如 Kafka、SQL、NoSQL 和时序数据库)的集成,无需编写代码。
EMQX 有效解决了处理大规模 MQTT 消息传输所面临的挑战,使其非常适合需要数百万台设备高效连接和通信的大规模物联网应用场景。