MQTT 协议基本介绍

2023-11-16

目录

 

一、简介

二、基本特点

三、基本概念

四、简单示例

五、进一步了解MQTT 3

六、MQTT协议的工作方式

七、MQTT控制报文

CONNECT报文

CONNACK报文

八、清除会话、保留消息和QoS的组合

九、MQTT 5.0 协议新增介绍

十、设计目标

十一、属性

十二、原因码

十三、实际应用

十四、MQTT 与 Kafka

十五、下一步

十六、参考信息


一、简介

MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的“轻量级”消息协议,由 IBM 发布。

  • MQTT 可以被解释为一种低开销,低带宽占用的即时通讯协议,可以用极少的代码和带宽的为连接远程设备提供实时可靠的消息服务,它适用于硬件性能低下的远程设备以及网络状况糟糕的环境下,因此 MQTT 协议在 IoT(Internet of things,物联网),小型设备应用,移动应用等方面有较广泛的应用。
  • IoT 设备要运作,就必须连接到互联网,设备才能相互协作,以及与后端服务协同工作。而互联网的基础网络协议是 TCP/IP,MQTT 协议是基于 TCP/IP 协议栈而构建的,因此它已经慢慢的已经成为了 IoT 通讯的标准。

在简介完 MQTT 协议后,EMQ君将从其一些基本特点和基本概念为两部分,介绍 MQTT 协议。

二、基本特点

  1. MQTT是一种发布/订阅传输协议,基本原理和实现如下;

MQTT 协议提供一对多的消息发布,可以解除应用程序耦合,信息冗余小。该协议需要客户端和服务端,而协议中主要有三种身份:发布者(Publisher)、代理(Broker,服务器)、订阅者(Subscriber)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,而消息发布者可以同时是订阅者,实现了生产者与消费者的脱耦。

  1. 使用 TCP/IP 提供网络连接,提供有序、无损、双向连接;

    MQTT 是一种连接协议,它指定了如何组织数据字节并通过 TCP/IP 网络传输它们。设备联网,也需要连接到互联网中,在大万维的世界中,TCP 如同汽车,有轮子就能用来运输数据,MQTT 就像是交通规则。在网络模型中,TCP是传输层协议,而 MQTT是在应用层,在 TCP 的上层,因此MQTT 也是基于这个而构建的,提高了可靠性。

  2. 对负载内容屏蔽的消息传输;

    可以对消息订阅者所接受到的内容有所屏蔽。

  3. 具体有三种消息发布的服务质量:

    • 至多一次,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    • 至少一次,确保消息到达,但消息重复可能会发生。
    • 只有一次,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
  4. 小型传输,开销小,固定长度的头部是 2 字节,协议交换最小化,以降低网络流量;

    整体上协议可拆分为:固定头部+可变头部+消息体,这就是为什么在介绍里说它非常适合"在物联网领域,传感器与服务器的通信,信息的收集"。

  5. 使用Last Will和Testament特性通知有关各方客户端异常中断的机制;

    Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。

    Testament:遗嘱机制,功能类似于Last Will。

三、基本概念

  1. MQTT 客户端

    一个使用 MQTT 协议的设备、应用程序等,它总是建立到服务器的网络连接。

    • 可以发布信息,其他客户端可以订阅该信息

    • 订阅其它客户端发布的消息

    • 退订或删除应用程序的消息

    • 断开与服务器连接

  2. MQTT 服务器

    MQTT 服务器以称为 Broker(消息代理),以是一个应用程序或一台设备。它是位于消息发布者 和订阅者之间

    • 接受来自客户端的网络连接
    • 接受客户端发布的应用信息
    • 处理来自客户端的订阅和退订请求
    • 向订阅的客户转发应用程序消息
  3. 主题(Topic)

    连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。

    • 要订阅的主题。一个主题可以有多个级别,级别之间用斜杠字符分隔。例如,/worldemq/emqtt/emqx 是有效的主题。

    • 订阅者的Topic name支持通配符#和+ :

      • # 支持一个主题内任意级别话题
      • +只匹配一个主题级别的通配符
    • 客户端成功订阅某个主题后,代理会返回一条 SUBACK 消息,其中包含一个或多个 returnCode 参数

  4. 主题筛选器(Topic Filter)

    一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。

  5. QoS(消息传递的服务质量水平)

    服务质量,标志表明此主题范围内的消息传送到客户端所需的一致程度。

    • 值 0:不可靠,消息基本上仅传送一次,如果当时客户端不可用,则会丢失该消息。
    • 值 1:消息应传送至少 1 次。
    • 值 2:消息仅传送一次。
  6. 会话(Session)

    每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。

  7. 订阅(Subscription)

    订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

    • 客户端在成功建立TCP连接之后,发送CONNECT消息,在得到服务器端授权允许建立彼此连接的CONNACK消息之后,客户端会发送SUBSCRIBE消息,订阅感兴趣的Topic主题列表(至少一个主题)
    • 订阅的主题名称采用UTF-8编码,然后紧跟着对应的QoS值
  8. 发布(publish)

    控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息,MQTT 客户端发送消息请求,发送完成后返回应用程序线程

    • 比如安卓的推送服务,还有一些即时通信软件如微信等也是采用的推送技术。
  9. 负载(Payload)

    消息订阅者所具体接收的内容

四、简单示例

MQTT 协议主要是根据以下情况设计的:

  • M2M(Machine to Machine),机器或设备间端到端通信,比如传感器之间的数据通讯。
  • 设备(Machine)中,例如传感器,硬件能力很弱,协议要考虑尽量小的资源消耗,比如计算能力和存储等。

根据 MQTT 的基础了解后并结合简单的架构,在这里做一个简单的示例图,可以更直观的理解MQTT协议的通信模型。MQTT Broker 就选择 EMQ 作为示范。比如有1个温度传感器(1个Machine),1个移动设备,1个电脑,一个服务器(3个Machine),都可以得到或者显示温度传感器的温度值,需要先通过 MQTT 协议subscribe(订阅)一个比如叫 temperature 的 topic(主题)如下:

mqtt2.png

图中移动设备,服务器,电脑需要先通过 EMQ subscribe 一个叫 temperature 的 topic,当温度传感器 publish 温度数据,三个设备就可以收到了。

五、进一步了解MQTT 3

MQTT 3 (当前版本3.1.1)是目前使用的最为广泛的MQTT协议标准。尽管MQTT5标准已经发布,并且带来了一些令人振奋的新特性,但是在整个应用场景上,从后台服务到消息中间件再到客户端SDK等环节上的产品升级并没有都完成,再加上既有部署的维护,业界从版本3到5的过渡可能会持续相当长一段时间,所以,对于刚加入物联网行业的生力军来说,现在来学习MQTT 3依然是一件很有意义的事情。

六、MQTT协议的工作方式

前面简介中讲到,在一个QMTT协议中有三个角色会参与到整个通信过程,发布者(publisher)、代理(broker)和订阅者(subscriber)。有别于传统的客户端/服务器通讯协议,MQTT协议并不是端到端的,消息传递通过代理,包括会话(session)也不是建立在发布者和订阅者之间,而是建立在端和代理之间。代理解除了发布者和订阅者之间的耦合。

除了发布者和订阅者之间传递普通消息,代理还可以为发布者处理保留消息和遗愿消息,并可以更改服务质量(QoS)等级。

七、MQTT控制报文

MQTT协议工作在TCP之上,端和代理之间通过交换预先定义的控制报文来完成通信。MQTT报文有3个部分组成,并按下表顺序出现:

固定报头(fixed header) 可变报头(variable header) 荷载(payload)
所有报文都包含 部分报文包含 部分报文包含

所有的MQTT控制报文都有一个固定报头,期格式如下:

协议版本3定义了14种MQTT报文,用于建立/断开连接、发布消息、订阅消息和维护连接。固定报头的第一字节的4-7位的值指定了报文类型,其取值如下表。0和15为系统保留值;0-3位为标志位,依照报文类型有不同的含义,事实上,除了PUBLISH报文以外,其他报文的标志位均为系统保留。如果收到报文的标志位无效,代理应断开连接。

报文类型 描述
CONNECT 1 客户端向代理发起连接请求
CONNACK 2 连接确认
PUBLISH 3 发布消息
PUBACK 4 发布确认
PUBREC 5 发布收到(QoS2)
PUBREL 6 发布释放(QoS2)
PUBCOMP 7 发布完成(QoS2)
SUBSCRIBE 8 客户端向代理发起订阅请求
SUBACK 9 订阅确认
UNSUBSCRIBE 10 取消订阅
UNSUBACK 11 取消订阅确认
PINGREQ 12 PING请求
PINGRESP 13 PING响应
DISCONNECT 14 断开连接

固定报头的第二字节起表示报文的剩余长度。最大4个字节,每字节可以编码至127,并含有一位继续位,如继续位非0,则下一字节依然为剩余长度。由此,理论上一个控制报文最长可以到256MB。

一些报文在固定报头和荷载之间可以有一个可变报头。可变报头的内容根据报文类型不同而不同。最常见的可变报头是报文标识符(PacketIdentifier)。

一些报文可以在最后携带一个荷载。不同的报文可以无荷载,可选荷载,或必须带有荷载。

限于篇幅,在这里我们仅以CONNECT和CONNACK为例解释一下MQTT报文的构成和报文响应行为。其他报文请查阅MQTT标准文档。

CONNECT报文

限于篇幅,在这里我们仅以CONNECT为例解释一下MQTT报文的构成。其他报文请查阅MQTT标准文档。
CONNECT是客户端连接到代理的第一个报文,如果在连接已经存在,代理收到该报文将会断开现有连接。

CONNECT报文的固定报头

CONNECT报文的可变报头

CONNECT报文的可变报头由4部分组成:

  • 协议名。协议名是UTF-8编码的大写的MQTT。
  • 协议级别。MQTT 3.1.1的协议级别为4.
  • 连接标志位。定义连接行为的参数。见下表。
  • Keep Alive。2字节,客户端和代理之间的无活动时间超过该值后,应关闭连接。如果该值置0表示客户端不要求代理启用KEEPALIVE功能。

连接标志位:

7 6 5 4 3 2 1 0
  用户名 密码 保留遗愿 遗愿QoS 遗愿QoS 遗愿 清除会话 保留(0)

清除会话标志位
这个标志位定义了如何处理会话状态。如果设置为0,客户端和代理可以恢复上一次连接时的会话状态,如果上一次连接的会话状态不存在,代理将会为客户端建立一个新的会话。如果该位设置为1,则双方将清除掉上一次连接的会话状态并建立一个新的会话。

遗愿标志位
如果遗愿标志为1,则遗愿消息会被存储在代理上,当连接关闭时,代理将发布这个消息,除非在客户端断开连接时把遗愿消息清除了。

遗愿QoS标志位
指定了遗愿消息的服务质量等级。

保留遗愿消息标志位
指定在发布遗愿消息的时候,是否把该消息作为保留消息存储在代理。

用户名标志位
如果设置为1,则用户名必须出现在荷载中,反之,用户名不允许出现在荷载中。

密码标志位
如果该位为1,则密码必须出现在荷载中;如果该位为0,则密码不允许出现在荷载中。如果用户名标志位为0,则该位必须也为0。

CONNECT报文的荷载

CONNECT报文的荷载由一个或者多个字段组成,这些字段是否出现由可变报头中的标志位决定。字段总是以长度开始。字段出现的顺序必须是:客户端标识符,遗愿主题,遗愿消息,用户名,密码。

CONNECT报文的响应

在代理在为MQTT协议开放的端口上接收到TCP连接请求并建立连接后应该会收到CONNECT报文,如果在一定时间内代理没有收到CONNECT报文,则应该关闭这个TCP连接。
在收到CONNECT报文后,代理应该检查报文格式是否符合协议标准。如果不符合协议标准,代理应关闭连接,且不发送CONNACK报文给客户端。
代理可以检查CONNECT报文的内容并执行响应的认证和鉴权。如果这些检查没有通过,代理应该向客户端发送一个带有非0返回码的CONNACK报文。

CONNACK报文

CONNACK是代理用来响应客户端CONNECT的报文。代理向客户端发送的第一个报文必须是CONNACT。CONNACK有一个固定报头,一个可变报头,但是不带有荷载。

CONNACK的固定报头

CONNACT报文只有固定报头和一个2字节的可变报头,所以它的剩余长度总是2。

CONNACK报文的可变报头

CONNACK报文的可变报头为定长2字节。第一字节的0位表示是否有会话存在。如果代理上已经有请求连接的客户端的会话,且连接请求的清除会话标识为0,则该位为1,否则该位为0。客户端可以根据这一位的值采取响应行为,比如(重新)订阅主题等。

CONNACK报文的可变报头的第二字节为返回码。如果CONNECT请求的格式正确,但是代理依然不能允许客户端连接,则返回码为一个非零值。如果连接成功,则返回0。

返回码的定义:

返回码含义
0 成功,连接请求被接受。
1 拒绝连接,不可接受的协议版本。
2 拒绝连接,不被允许的身份识别符(Client Identifier)。
3 拒绝连接,服务器不可用。
4 拒绝连接,无效的用户名和密码。
5 拒绝连接,客户端无授权。
6-255 系统保留。

客户端接受到代理的CONNACK的返回码为0,则连接建立完成,双方可以开始通信。

八、清除会话、保留消息和QoS的组合

清除会话、保留消息等概念,在传统的客户端/服务器方式的通信中不一定会出现,这些概念有时候不太容易理解,特别是当他们被组合起来用的时候。

下面的表格汇总了当一个客户端连接上来时,它能收到消息的各种情况。

清除会话位 保留位 订阅QoS 发布QoS 可收到的消息
Y N 0 0 N
Y N 0 1 N
Y N 1 0 N
Y N 1 1 N
N N 0 0 N
N N 0 1 N
N N 1 0 N
N N 1 1 Y,会话全部消息
Y Y 0 0 Y,最后一条消息
Y Y 0 1 Y,最后一条消息
Y Y 1 0 Y,最后一条消息
Y Y 1 1 Y,最后一条消息
N Y 0 0 Y,最后一条消息
N Y 0 1 Y,最后一条消息
N Y 1 0 Y,最后一条消息
N Y 1 1 Y,会话全部消息

九、MQTT 5.0 协议新增介绍

MQTT 5.0 协议相比 MQTT 3.1.1 协议新增了许多内容, 比如说属性,AUTH 包,还有对一些字段做了修改,比如将 Clean Session 修改成 Clean Start 配合 Session Expiry Internal 去实现更灵活的会话控制。

这里就简单罗列一下 5.0 协议新增的内容。

十、设计目标

  • 增强了扩展性
  • 改善了错误报告的方式
  • 定型了一些通用范式,例如能力发现和请求、响应
  • 扩展机制包括用户属性(user properties)
  • 性能改善,并且添加了对小客户端(small clients) 的支持

读者可以参考MQTT5.0协议规范的附录C来了解协议变更。

十一、属性

为了达成新协议的设计目标,MQTT 5.0 协议中新增了许多属性,以下是新添加的属性列表。

标识符 Identifier(十进制) 标识符 Identifier(十六进制) 名称(用法)Name(usage) 类型 Type 报文/遗嘱属性 Packet/Will Properties
1 0x01 有效载荷格式指示器 Payload Format Indicator 字节 PUBLISH, 遗嘱属性 Will Properties
2 0x02 消息到期间隔 Message Exipiry Interval 四字节整形 PUBLISH,遗嘱属性
3 0x03 内容类型 Content Type UTF-8 编码字符串 PUBLISH,遗嘱属性
8 0x08 响应主题 Response Topic UTF-8 编码字符串 PUBLISH,遗嘱属性
9 0x09 关联数据 Correlation Data 二进制数据 Binary Data PUBLISH,遗嘱属性
11 0x0B 订阅标识符 Subscription Identifier 可变字节整形 PUBLISH, SUBSCRIBE
17 0x11 会话到期间隔 Session Expiry Interval 四字节整形 CONNECT, CONNACK, DISCONNECT
18 0x12 已分配客户端标识符 Assigned Client Identifier UTF-8 编码字符串 CONNACK
19 0x13 服务器保活 Server Keep Alive 两字节整形 CONNACK
21 0x15 认证方法 Authentication Method UTF-8 编码字符串 CONNECT, CONNACK, AUTH
22 0x16 认证数据 Authentication Data 二进制数据 CONNECT, CONNACK, AUTH
23 0x17 请求响应信息 Request Response Information 字节 CONNECT
24 0x18 遗嘱延迟间隔 Will Delay Interval 四字节整形 遗嘱属性 Will Properties
25 0x19 请求响应信息 Request Response Information 字节 CONNECT
26 0x1A 响应信息 Response Information UTF-8 编码字符串 CONNACK, DISCONNECT
28 0x1C 服务器引用 Server Reference UTF-8 编码字符串 CONNACK, DISCONNECT
31 0x1F 原因字符串 Reason String UTF-8 编码字符串 CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK,UNSUBACK, DISCONNECT, AUTH
33 0x21 接收最大值 Receive Maximum 两字节整形 CONNECT, CONNACK
34 0x22 主题别名最大值 Topic Alias Maximum 两字节整形 CONNECT, CONNACK
35 0x23 主题别名 Topic Alias 两字节整形 PUBLISH
36 0x24 服务质量最大值 Maximum QoS 字节 CONNACK
37 0x25 保留可用 Retain Available 字节 CONNACK
38 0x26 用户属性 User Property UTF-8 字符串对 UTF-8 String Pair CONNECT, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, UNSUBACK, DISCONNECT, AUTH
39 0x27 最大报文大小 Maximum Packet Size 四字节整形 CONNECT, CONNACK
40 0x28 可用通配符订阅 Wildcard Subscription Available 字节 CONNACK
41 0x29 可用订阅标识符 Subscription Identifier Available Byte CONNACK
42 0x2A 可用共享订阅 Shared Subscription Available 字节 CONNACK

十二、原因码

MQTT v3.1.1 只有寥寥 6 个返回码,用来表示网络连接时可能会出现的异常行为,在引入属性后的 MQTT 5.0 协议中,仅仅这 6 个返回码显然已经不足以用来描述各种异常行为,因此MQTT 5.0 协议中将返回码改成了原因码,用来实现改善错误报告的目的。

原因码(十进制) 原因码(十六进制) 名称 报文
0 0x00 成功 Success CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, UNSUBACK, AUTH
0 0x00 正常断连 Normal disconnection DISCONNECT
0 0x00 准许 QoS 0 Granted QoS 0 SUBACK
1 0x01 准许 QoS 1 Granted QoS 1 SUBACK
2 0x02 准许 QoS 2 Granted QoS 2 SUBACK
4 0x04 以遗嘱消息断开连接 Disconnect with Will Message DISCONNECT
16 0x10 没有匹配的订阅者 No matching subscribers PUBACK, PUBREC
17 0x11 没有订阅 No subscription existed UNSUBACK
24 0x18 继续认证 Continue authentication AUTH
25 0x19 重新认证 Re-authenticate AUTH
128 0x80 未指定错误 Unspecified error CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT
129 0x81 畸形报文 Malformed Packet CONNACK, DISCONNECT
130 0x82 协议错误 Protocol Error CONNACK, DISCONNECT
131 0x83 实现特有错误 Implementation specific error CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT
132 0x84 不支持的协议版本 Unsupported Protocol Version CONNACK
133 0x85 客户端标识符无效 Client Identifier not valid CONNACK
134 0x86 错误的用户名和密码 Bad User Name or Password CONNACK
135 0x87 未授权 Not authorized CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT
136 0x88 服务器不可用 Server unavailable CONNACK
137 0x89 服务器繁忙 Server busy CONNACK, DISCONNECT
138 0x8A 禁止访问 Banned CONNACK
139 0x8B 服务器关机中 Server shutting down DISCONNECT
140 0x8C 错误验证方法 Bad authentication method CONNACK, DISCONNECT
141 0x8D 保活超时 Keep Alive timeout DISCONNECT
142 0x8E 会话被接管 Session taken over DISCONNECT
143 0x8F 主题过滤器无效 Topic Filter invalid SUBACK, UNSUBACK, DISCONNECT
144 0x90 主题名无效 Topic Name invalid CONNACK, PUBACK, PUBREC, DISCONNECT
145 0x91 报文标识符在使用中 Packet Identifier in use PUBACK, PUBREC, SUBACK, UNSUBACK=
146 0x92 没有发现报文标识符 Packet Identifier not found PUBREL, PUBCOMP
147 0x93 超出接收最大值 Receive Maximum exceeded DISCONNECT
148 0x94 主题别名无效 Topic Alias invalid DISCONNECT
149 0x95 报文太大 Packet too large CONNACK, DISCONNECT
150 0x96 消息传输速率太高 Message rate too high DISCONNECT
151 0x97 超出限额 Quota exceeded CONNACK, PUBACK, PUBREC, SUBACK, DISCONNECT
152 0x98 管理行为 Administrative action DISCONNECT
153 0x99 有效载荷格式无效 Payload format invalid PUBACK, PUBREC, DISCONNECT
154 0x9A 不支持消息保留 Retain not supported CONNACK, DISCONNECT
155 0x9B 不支持的QoS QoS not supported CONNACK, DISCONNECT
156 0x9C 使用另一台服务器 Use another server CONNACK, DISCONNECT
157 0x9D 服务器被移除 Server moved CONNACK, DISCONNECT
158 0x9E 不支持的共享订阅 Shared Subscription not supported SUBACK, DISCONNECT
159 0x9F 超出连接速率 Connection rate exceeded CONNACK, DISCONNECT
160 0xA0 最大连接时间 Maximum connect time DISCONNECT
161 0xA1 不支持的订阅标识符 Subscription Identifiers not supported SUBACK, DISCONNECT
162 0xA2 不支持的通配符订阅 Wildcard Subscription not supported SUBACK, DISCONNECT

十三、实际应用

1. 由于主题别名(Topic Alias)的引入,使 MQTT PUBLISH 控制报文的体积更小,更便于在带宽和网络受限的物联网环境下传输消息。

2. AUTH 包的引入使 MQTT 协议扩展了认证方式,增加了询问/响应式的认证方式,服务器或客户端在发送 CONNECT 与接收 CONNACK 包之间交换 AUTH 报文来完成身份验证的流程。

3. 由于很多嵌入式设备的 CPU 并没有对 AES 加密标准下的加密算法提供硬件级的支持,因此,使用 AES 加密对嵌入式设备的硬件开销是非常大的,所以 MQTT 5.0 协议提供了新的加密算法 ChaCha20 ,ChaCha20 在软件层面做加密和解密处理要比 AES 快得多。因此也算是一大进步,不过本人更希望 MQTT 下一版协议能够增加对 AEAD 加密算的支持。

总的来说,MQTT 5.0 协议的内容增加了很多,协议书的内容几乎是 MQTT 3.1.1 协议的两倍,除了本文上述提到的这些新的变化,还有很多非常细节的东西没有在这里做详细的介绍。基于 MQTT 5.0 协议现有的很多属性,在实现 MQTT 5.0 协议的时说不定还能挖掘出更多的有意思的新用法,不过这需要开发人员去多读协议的具体细节,去更深入地理解 MQTT 5.0 协议。

EMQ作为在github中最流行的MQTT中间件,开始全面支持MQTT 5.0协议,读者有兴趣的话,赶紧下载试用吧。

十四、MQTT 与 Kafka

MQTT 与 Kafka 是完全不同的两个东西, MQTT 是协议,是一个技术标准,由 OASIS 技术委员会的成员(其成员多数为 IBM 和微软的顶级工程师)制订。而 Kafka 是已经实现的开源流处理平台,最早由 LinkedIn 开发,于 2011 年开源后交给 Apache Incubator孵化后成为了 Apache 软件基金会的顶级项目。

两者之前唯一存在的联系恐怕就是它们都和发布/订阅范式有关了吧。MQTT 是基于发布/订阅范式的消息协议,而Apache Kafka 的生产、消费的流程也是属于发布/订阅范式的。那么如果我们基于 MQTT 协议去实现一个消息 broker,是否这个MQTT broker是否能和Kafka作用等价呢? 答案当然是否定的!

Kafka 虽然也是基于发布订阅范式的消息系统,但它同时也被称为“分布式提交日志”或者“分布式流平台”,它的最主要的作用还是实现分布式持久化保存数据的目的。Kafka 的数据单元就是消息,可以把它当作数据库里的一行“数据”或者一条“记录”来理解,Kafka 通过主题来进行分类,kafka 的生产者发布消息到某一特定主题上,由消费者去消费特定主题的消息,其实生产者和消费者就可以理解成发布者和订阅者,主题就好比数据库中的表,每个主题包含多个分区,分区可以分布在不同的服务器上,也就是说通过这种方式来实现分布式数据的存储和读取, kafka 分布式的架构利于读写系统的扩展和维护(比如说通过备份服务器来实现冗灾备份,通过架构多个服务器节点来实现性能的提升),在很多有大数据分析需求的大型企业,都会用到Kafka 去做数据流处理的平台。

而MQTT 最开始就是为物联网设备的网络接入而设计的,物联网设备大多都是性能低下,功耗较低的计算机设备,而且网络连接的质量也是不可靠的,所以在设计协议的时候最需要考虑的几个重点是:

  1. 协议要足够轻量,方便嵌入式设备去快速地解析和响应。
  2. 具备足够的灵活性,使其足以为 IoT 设备和服务的多样化提供支持。
  3. 应该设计为异步消息协议而非同步协议,这么做是因为大多数 IoT 设备的网络延迟很可能非常不稳定,若使用同步消息协议,IoT 设备需要等待服务器的响应,对于为大量的 IoT 设备提供服务这一情景,显然是非常不现实的。
  4. 必须是双向通信,服务器和客户端应该可以互相发送消息。

MQTT 协议完美地解决了上述几点要求,并且最新版的 MQTT v5.0 协议做了很多优化,使其协议相比过去的 v3.1.1 版本具备更强大的灵活性以及对带宽的更少占用。

要说基于 MQTT 协议的消息 broker 和 Kafka 的区别的话,EMQ君认为还是在于它们的侧重点不同,Kafka 的侧重点在于数据的存储和读取,针对实时性比较高的流式数据处理场景;而 MQTT broker 的侧重点在于客户端和服务器的通信。

MQTT broker 与 Kafka 所采用的消息交换范式是如此相近,将其两者结合起来使用显然是一个非常不错的主意,事实上,很多 MQTT broker,诸如EMQ X已经实现了 MQTT broker 与 Kafka的桥接。MQTT broker 用来快速的对大量物联网设备发来的消息做接收处理响应,而Kafka 对这些大量的数据做采集存储,交给数据分析人员来分析处理消息,这一流程或许会成为未来物联网云平台的一大通用范式。

十五、下一步

读完本文之后,不能光做不练啊,想试用一下MQTT吗?请参考EMQ君的文章常见MQTT服务器搭建与试用

十六、参考信息


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQTT 协议基本介绍 的相关文章

  • 单向链表的Java实现,以及相关函数。

    如上图所示就是单向链表的示意图 下面就是Java实现单向链表的基本过程与源码 可以跑起来的 1 创建一个节点类 package com wpl snglelink public class Node public Object getDat
  • c++_函数返回值,引用&作为函数返回值

    catalog 函数返回值 返回值是 const T 返回值的类型是 T 返回的对象是 局部对象 实现原理 返回的对象是 全局对象 实例 函数返回值 返回值是 const T ST operator ST a ST b return ST
  • 每日一题——求解连通分量个数

    题目描述 从键盘接收图的顶点集 关系集 创建无向图 第一行依次输入图的顶点个数n 关系个数k 以空格隔开 顶点个数 lt 20 第二行依次输入顶点值 类型为字符 接下去有k行 每行为两个字符 u 和 v 表示节点u 和 v 连通 格式为 u
  • 麦克输入

    如图所示 单端输入只有一个输入引脚ADCIN 使用公共地GND作为电路的返回端 ADC的采样值 ADCIN电压 GND的电压 0V 这种输入方式优点就是简单 缺点是如果vin受到干扰 由于GND电位始终是0V 所以最终ADC的采样值也会随着
  • Ros noetic 机器人坐标记录运动路径和发布 实战教程(B)

    前言 网上记录Path的写入文件看了一下还挺多的 有用yaml作为载体文件 也有用csv文件的路径信息 也有用txt来记录当前生成的路径信息 载体不重要 反正都是记录的方式 本文主要按yaml的方式写入 本文将撰写csv方式的文件写入格式
  • mysql查询每年每个月的数据_mysql 查询一年中每个月份的数据量

    这个是用mid 函数 截取字符串 mysql gt select count as 数量 mid time 1 7 as month from my add where time between 2015 01 01 00 00 00 an
  • 华为OD机试真题-字符串解密 【2023.Q1】

    题目内容 题目描述 有两个字符串string1和string2 string1是一个被加扰的字符串 小写英文字母 a z 和数字字符 0 9 组成 而加扰字符串由 0 9 a f 组成 string1里面可能包含0个或多个加扰子串 剩下可能
  • Dell服务器IDRAC管理界面配置NTP时间同步

    登录idrac管理界面 1 点击 iDRAC设置 2 在属性里面点击 设置 3 时区和NTP 4 在NTP1这项填写NTP的服务器地址5 右下角点击 应用 过几分钟就生效了
  • 回归指令_SWAP字节交换指令详解

    说明 本篇文章是为下一篇文章 在触摸屏上演示7段数码管指令而预先讲解的一个指令 正文 字节交换指令应该算一个比较重要的指令 特别PLC要和一些HMI设备通讯 在HMI上录入数据的时候 就有可能需要经常使用这个指令 来看一下西门子200PLC
  • 基于二叉树的算术表达式计算与实现

    非常有趣的一道题 代码参考 https blog csdn net over786 article details 17395567 把一个正常的表达式写成这个样子咯 问题的难点在于整数有多位 而且你要判断好哪个符号作为根 比如5 3 4
  • 华为OD机试 Python 限载货物数最小值

    描述 在火车站旁的货运站 小明负责调度2K辆中转车 其中K辆用于干货 K辆用于湿货 每批到站的货物来自不同的供货商 需要按照顺序装入中转车 注意 一个供货商的货物只能装在一辆车上 不能分开 但是 一辆车可以放多个供货商的货物 问题是 要让所
  • 检测洛达芯片的软件_洛达1562A与1536u与杰里有哪些区别?购买前10条须知

    相信大家应该对AirPodspro已经不陌生了 那么对于廉价版本的华强北AirPodspro有多少了解呢 芯片 洛达 中科蓝讯 杰里 恒炫 惴昱 等等 壳料 彩创壳 原厂彩创壳 资江壳 高美特壳料等等 喇叭也有好多种喇叭 至于大家为什么在各
  • (牛客网)华为机试(二)

    牛客网 华为机试题集解答 在解题前先分享一波oj刷题的固定格式代码 方便输入时使用 import java util import java io public class Main 一定要使用Main作为类名 public static
  • CODIS原理 之 数据迁移流程[2.X]

    CODIS原理 之 数据迁移流程 2 X 分类 源码剖析设计思路 1173 0 作者 邹祁峰 邮箱 Qifeng zou job hotmail com 博客 http blog csdn net qifengzou 日期 2016 08

随机推荐

  • 云安全架构的设计

    公有云安全概述 云安全职责划分 共同担责 软件即服务SAAS 云服务厂家几乎负责所有的安全性 因为租户只能访问 管理和使用其提供的应用程序 但无法对应用程序做破坏性操作 例如 SAAS服务厂家提供安全 日志 运维 审计 应用安全性检测等 二
  • 物联网开发124 - Micropython ESP32 C3连接AHT20温湿度传感器和BMP280压力传感器模块

    一 目的 这一节我们来学习如何使用合宙ESP32 C3 连接AHT20温湿传感器模块和BMP280压力传感器模块 使用ST7735屏幕进行显示 下面我们一起来学习一下吧 二 环境 ESP32 C3开发板 MicroPython v1 19
  • Android attr6,android – 未找到样式属性attr / colorSecondary

    我无法建立我的项目 它显示我attr colorSecondary未找到错误 看看我的风格和清单 请告诉我什么是错的 Android studio version 3 0 canary 9 compileSdkVersion 25 buil
  • 【C/C++】类型转换

    文章目录 1 C语言中的类型转换 1 1隐士类型转换 相近类型 意义相近 1 2 强制类型转换 2 C 的类型转换 2 1相近类型转换 static cast 2 2强制类型转换 reinterpret cast 2 3去掉对象const属
  • pytorch用于多标签分类的bceloss

    def bceloss output target positive prob F logsigmoid output negative prob F logsigmoid output loss positive prob target
  • sklearn机器学习——逻辑回归(一)

    1 概述 1 1 名为 回归 的分类器 x为特征向量 通过函数 线性回归使用输入的特征矩阵X来输出一组连续型的标签值y pred 以完成各种预测连续型变量的任务 比如预测产品销量 预测股价等等 那如果我们的标签是离散型变量 尤其是 如果是满
  • Java常用集合分析

    ArrayList与Vector 动态数组 速度较慢 创建时可以使用initialCapacity指定初始化大小 如果不指定则数组大小默认为10 ArrayList与Vector的区别 ArrayList是线程不安全的 当多个线程访问同一个
  • matlab调整图像大小123开始—放缩比例

    imresize 调整图像大小 此 MATLAB 函数 返回图像 B 它是将 A 的长宽大小缩放 scale 倍之后的图像 输入图像 A 可以是灰度 RGB 或二值图像 如果 A 有两个以上维度 则 imresize 只调整前两个维度的大小
  • 【gitlab wiki】git首次上传本地文档操作步骤

    1 在gitLab中创建一个项目 2 进入本地电脑中的你要上传文件的文件目录 右击鼠标选择 Git Bash Here git命令窗口 本机电脑要安装好git 3 在远程git项目中 复制出项目http地址 4 在 Git Bash Her
  • OBJECT和EMBED标签

    OBJECT和EMBED标签 一 介绍 我们要在网页中正常显示flash内容 那么页面中必须要有指定flash路径的标 签 也就是OBJECT和EMBED标签 OBJECT标签是用于windows平台的IE浏览器的 而EMBED是用于win
  • 微信可以远程控制电脑吗_教你远程控制你的电脑

    众所周知啊 上班最尴尬的就是 你办公室的电脑还开着 可是人没了 老板看见你的电脑屏幕 打开的不是办公软件 而是游戏 电影网站 特意找了一个微信小程序能够帮你远程控制电脑锁屏 关机 甚至还能帮你操控电脑 打开关闭微信 以及各种程序 这款软件只
  • mysql 无法插入中文

    MySQL数据库默认编码已经是utf8了 default character set utf8 可是向数据库中表中插入中文时 却老是出现 xB5 xA5 xD1 xA1 for column 这样的错误 经过查阅网上类型的错误后 发现一个很
  • STM32 ADC采样不准怎么办

    最近在使用STM32L011的ADC时 发现ADC采样值极其不准确 经过查找资料 和反复测试 总算摸出点门道 如将VDDA接到VDD 那么电源的波动会极大的影响ADC精度 不过使用内部参考电压可以计算实际的VDDA电压 说明 VREFINT
  • Ubuntu 16.04下基于Anaconda安装cuda、cudnn及Pytorch

    Anaconda的基本使用见之前的博客 Ubuntu 16 04下Anaconda的安装及使用 创建虚拟环境pytorch gpu 并激活该环境 conda create name pytorch gpu python 3 6 source
  • CSS浮动(1)

    一 结构伪类选择器 1 作用与优势 作用 根据元素在HTML中的结构关系查找元素 优势 减少对于HTML中类的依赖 有利于保持代码整洁 场景 常用于查找某父级选择器中的子元素 2 选择器 选择器 说明 E first child 匹配父元素
  • python 数据库的中文乱码问题

    在使用pymssql操作sqlserver数据库时 碰到了中文乱码的问题 之前从网上查了很多 又是python编码 又是数据库编码什么的 非常乱 试了很多 好多都解决不了问题 数据库是sqlserver 先说我碰到的问题 数据库的配置cha
  • 【安卓学习之常见问题】 AAPT: error: resource drawable/ (aka xxx) not found(含as快捷键说明)

    安卓学习之常见问题 AAPT error resource drawable aka xxx not found 含as快捷键说明 相关文章 android学习开源项目之BasePopup BasePopup PopupWindow 进行二
  • c语言编程题

    include stdafx h include
  • 概念解析

    注1 本文系 概念解析 系列之一 致力于简洁清晰地解释 辨析复杂而专业的概念 本次辨析的概念是 非极大值抑制 NMS 及其改进工作 非极大值抑制 NMS 原理 缺点和改进 1 背景介绍 在计算机视觉中 物体检测是一个核心且充满挑战的问题 众
  • MQTT 协议基本介绍

    目录 一 简介 二 基本特点 三 基本概念 四 简单示例 五 进一步了解MQTT 3 六 MQTT协议的工作方式 七 MQTT控制报文 CONNECT报文 CONNACK报文 八 清除会话 保留消息和QoS的组合 九 MQTT 5 0 协议