文档章节

MQTT5.0 消息发布流程

EMQX
 EMQX
发布于 08/03 11:42
字数 1199
阅读 9
收藏 0

概览

MQTT5.0协议对部分QoS报文,以及报文处理的流程做了一些升级,本文对此这部分升级的内容做简单的介绍。

QOS报文格式及处理流程

在 MQTT 协议中,消息分为 3 个等级,分别用 QoS0, QoS1, QoS2, 这三个不同的 QoS 值所代表的是不同

的服务质量等级。以下是每一个服务质量级别的具体描述:

0 : 最多一次发送(若消息等级为 QoS 0,发布者在发布消息时只会发送一次,不管消息是否送达); 1 : 至少一次消息发送(若消息等级为 QoS 1,发布者在发布消息时会重复发送以确保消息发送成功); 2 : 消息只发送一次,并保证送达。(若消息等级为 QoS 2, 发布者在发布消息时确保接收者只接收到一个消息并且消息不会重复)。

在三种 QoS 消息等级中,QoS 0 是最节省计算资源的, 而 QoS 1 在发布完消息后还需要去接收到一个发布确认报文来停止重复的报文发送, QoS 2 消息的传输则需要更多的步骤,它需要 4 次报文发送来确保消息是单次送达的,是所有消息类型中最费计算资源和带宽的。

以下是 3 种不同 QoS 值的处理流程图:

在 MQTT 3.0 中,QoS 0的消息发布流程是这样

  • QoS 0 消息

    发送者 控制报文流向 接受者
    PUBLISH QoS = 0, DUP = 0
    —>
    接收消息(可能不会收到)并处理
  • QoS 1 消息

    发送者 控制报文流向 接受者
    存储消息
    发送 PUBLISH QoS1, DUP = 0,带有 Packetld —>
    接收消息并处理
    发送带有 Packetld 和 PUBACK 确认报文
    丢弃消息

    若接收者没有接收到 QoS1 消息或者接收到的 QoS 1 消息有问题,是不会去发送 PUBACK 确认报文的,因此发送者不会丢弃 QoS1 消息,它还会再发送 这个消息,所以 QoS1 消息是有可能被重复发布的。

  • QoS 2 消息

    发送者 控制报文流向 接受者
    存储消息
    发送 PUBLISH QoS1, DUP = 0,带有 Packetld
    —>
    存储 Packet ID 然后准备应用消息的发送
    发布带有 Packetld 和 Reason Code 的 PUBREC 报文
    <---
    丢弃存储的消息,存储接收到的带有相同 packet ID 的 PUBREC 报文
    发送 PUBREC 报文 —> 丢弃 Packetld
    发送带有 Packetld 的 PUBCOMP 报文
    <---
    丢弃存储的状态

为了保证消息单次发送且能送达。首先它要发布一个 PUBLISH 报文,然后接收者在接收完成时并不会返回确认报文,它会存储接收到的消息,然后返回 PUBREC 报文给发送者,发送者在接收到 PUBREC 报文后, 将存储的 PUBLISH 报文替换成收到的 PUBREC 报文,然后发送 PUBREL 报文给接收者。 接收者收到 PUBREL 消息后丢弃之前存储的状态,此时消息已经到达接收者,并且能够确保只到达了一次。

MQTT 协议面对的是计算能力低下的嵌入式设备,虽然 MQTT 5.0 协议中对 QoS2 消息的处理流程做了一些轻微的优化,然而使用用 QoS2 消息通信仍然是非常耗资源的操作,所以通常情况下,如果对于消息传输的优先级要示不是特别高的话,请尽量不要传送 QoS 2 消息。

MQTT5.0升级

MQTT5.0在QoS上的升级主要体现在QoS2的接收者在处理报文的时候一点变化,

  • 在 MQTT 5.0 协议中,这里对 QoS2 消息的发布处理流程与 MQTT 3.0 协议稍有不同,在 MQTT 3.0 中,接收者接收到 QoS2 消息后既可以存储消息,也可以存储 Packet ID, 在 5.0 中则强制协议实现者只能存储 Packet Id。这么做是为了强制 MQTT 协议开发者减少 QoS2 消息的带宽损耗。
  • 在QoS2的接收者端,除了之前返回的PacketId之外,还返回了标识Reason Code的PUBREC报文。

EMQ发布的最新版本3.0已经包含了对MQTT5.0协议的支持,欢迎读者试用。


更多信息请访问我们的官网 emqx.io,或关注我们的开源项目 github.com/emqx/emqx ,详细文档请访问 官方文档

img

© 著作权归作者所有

EMQX
粉丝 4
博文 51
码字总数 65340
作品 0
杭州
私信 提问
EMQ 获得2019无锡世界物联网博览会 “新技术新产品新应用” 金奖

2019年9月7日,一年一度的世界物联网博览会在无锡顺利开幕。当晚,由物博会组委会主办的物联网之夜颁奖典礼——2019 年新技术新产品新应用成果发布会隆重举行。今年的评审专家委员会由中国工...

EMQX
09/11
15
0
消息框架技术方案

目标 功能:提供通用框架,解决消息发布、接收和处理流程。 约束:支持集群,支持WebSocket,保障消息不重不漏。 方案 消息框架由两部分组成 1、应用程序后端的Kafka消息:使用Kafka消息队列...

yongli82
2018/01/01
0
0
kafka学习笔记:知识点整理(一)

一、kafka 架构 1.1 拓扑结构 如下图: 图.1 1.2 相关概念 如图.1中,kafka 相关名词解释如下: 1.producer:  消息生产者,发布消息到 kafka 集群的终端或服务。2.broker:  kafka 集群...

愉快的鱼儿
2017/06/05
0
0
ActiveMQ使用教程

1、认识JMS 1.1 JMS的基本构件 1.1.1 连接工厂 连接工厂是客户用来创建连接的对象,例如ActiveMQ提供的ActiveMQConnectionFactory 1.1.2 连接 JMS Connection封装了客户与JMS提供者之间的一个...

kukudeku
2016/10/13
123
0
阿里中间件——消息中间件Notify和MetaQ

3.1、Notify Notify是淘宝自主研发的一套消息服务引擎,是支撑双11最为核心的系统之一,在淘宝和支付宝的核心交易场景中都有大量使用。消息系统的核心作用就是三点:解耦,异步和并行。下面让...

Eller
2016/10/27
585
0

没有更多内容

加载失败,请刷新页面

加载更多

Python查询比特币实时价格

在本文中我们将学习如何使用使用coinmarketcap提供的比特币行情API,编写Python程序来获取像比特币、莱特币或以太币之类的区块链数字货币的实时行情/实时价格。 1、比特币行情API调用代码 我...

汇智网教程
16分钟前
2
0
爬虫平台Crawlab核心原理--自动提取字段算法

⚠注意: 可配置爬虫现在仅在Python版本(v0.2.1-v0.2.4)可用,在最新版本Golang版本(v0.3.0)还暂时不可用,后续会加上,请关注近期更新 背景 实际的大型爬虫开发项目中,爬虫工程师会被要...

tikazyq
35分钟前
3
0
postman批量测试

postman批量调用: 先单个调用,成功了 再save为collection 再点击三角形,点击run 设置1000次,run就可以 见《postman批量测试.docx》

Danni3
41分钟前
8
0
js 对象操作 js 对象和对象赋值 去除关联性 对象原型操作 把一个对象A赋值给另一个对象B 并且对象B 修改 不会影响 A对象

当我们在项目需要 复制一个对象到另一个对象并且 被复制的对象不能受复制后的对象的影响。 我先总结下 我们哪些方法可以复制对象 // 直接赋值var obj1 = { a: 1 };var obj2 = obj1;...

xiaogg
42分钟前
7
0
Go微服务全链路跟踪详解

在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链。 该ID称为C...

倚天码农
56分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部