MQTT服务质量-QoS

2023-12-11 12:52
文章标签 qos mqtt 服务质量

本文主要是介绍MQTT服务质量-QoS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QoS是消息发送方和接收方之间的协议,定义了指定消息发送保证等级。本文将深入探究MQTT中不同的QoS等级。

QoS是什么

MQTT提供三个QoS等级:

  • 最多一次(QoS 0)
  • 至少一次(QoS 1)
  • 确切一次(QoS 2)

在MQTT中如何检查消息发送

当讨论MQTT中的QoS时,很重要的是考虑消息从发布的客户端到代理(broker)、从代理(broker)到订阅的客户端。这两方面的消息发送和微秒的区别。
发布消息到代理(broker)的客户端定义了消息传输期间的QoS等级。代理(broker)然后将消息传输给订阅的客户端,使用的QoS等级是由订阅的客户端在订阅过程时定义的。如果订阅的客户端定义的QoS等级低于发布的客户端,代理(broker)将会使用低等级的QoS传输消息。
理解了消息在MQTT中是如何传递的,为理解QoS级别在确保发布客户端、代理(broker)和订阅客户端之间的可靠通信方面的重要性奠定了基础。

为什么QoS重要

QoS对MQTT很重要,因为它的作用是让客户端能够选择符合网络可靠性和应用程序需求的服务级别。MQTT的固有能力,即使在不可靠的网络条件下,也能处理消息重新传输并确保发送,使QoS对于在这种具有挑战性的环境中促进无缝通信至关重要。通过提供不同的QoS等级,MQTT授权客户端优化其网络应用,达到稳定性和有效性之间理解的平衡。
现在,我们理解了QoS在MQTT中意义,让我们深入了解QoS的工作机制,探究它在各种网络条件下,如何确保稳定的消息传输的。

QoS 0如何工作

在最低等级,在MQTT中,QoS 0提供了一种尽力而为的机制,在该机制中,发送方不期望对消息的传递的确认或保证。这意味着接收方不确认其收到了消息,发送方不保存或重发消息。QoS 0,通常被称为“即发即弃”,其功能类似于底层TCP协议,在该协议中发送消息时无需进一步跟进或确认。
1.PNG

QoS 1如何工作

QoS 1,重点在确保消息至少发送一次到接收方。当一条消息以QoS 1发布时,发布方保存一个复本直到它接收到一条来自接收方的PUBACK包,确认消息成功接收。如果发送方在合理时间内没有收到PUBACK包,它会重新发送该消息来确保它的发送。
2.PNG
一旦收到消息,接收方可以立即进行处理。比如,如果接收方是一个MQTT代理(broker),它会分发消息到所有的订阅客户端,然后用一个PUBACK包响应,确认收到这条消息。
puback_packet.png
需要注意的是,在QoS 1中,如果发布客户端又发送了相同的消息,设置了一个重复(DUP)标志,但是这个标志是为了内部目的,不被代理(broker)或客户端处理。无论DUP标志如何,接收方仍会发送PUBACK包以确认收到消息,从而确保发送方知道成功传递。QoS 1的这种方法在可靠性和效率之间取得了平衡,确保至少一次到达接收方,同时允许适当处理潜在的重复项。

QoS 3如何工作

在MQTT中,QoS 2提供最高的等级,确保每条消息都被准确的发送一次到指定的接收者。为了达到这个目的,QoS 2涉及发送方和接收方之间四次握手。
3.PNG
当接收方从发送方收到一个QoS 2等级的PUBLISH数据包,它处理发布的数据,用一个PUBREC数据包响应发送方,确认PUBLISH数据包。如果发送方没有从接收方收到PUBREC数据包,它就会再次发送有一个重复(DUP)标志的PUBLISH数据包,直接收到确认。

发送方一旦收到PUBREC数据包,就可以安全的抛弃原来的PUBLISH数据包。发送方存储来自接收方的PUBREC数据包,以一个PUBREL数据包作为响应,接收方抛弃所有存储的状态,用一个PUBCOMP数据包作为响应。

当接收方收到PUBREL数据包,就会抛弃所有存储的状态,用一个PUBCOMP数据包作为响应。直到接收方完成处理,发送一个PUBCOMP数据包到发送方之前,接收方会存储对原始PUBLISH数据包的数据包标识符的引用。这一步避免了重复处理这个消息。
当发送方收到PUBCOMP数据包,已发送消息的数据包标识符就可以再次使用。

当QoS 2流程完成,双方就会确认消息已被发送,发送方也确认这个方法。
如果数据库包丢失,在规定的时间内发送方负载重新发送这条消息,无论发送方是一个MQTT客户端还是MQTT代理(broker)。接收方有责任相应的响应每个命令消息。

MQTT中QoS的关键考虑因素

当去理解MQTT中的QoS时,有几个重要的方面需要考虑。

QoS降级

发送方和接收方定义的QoS等级能够不同。发送消息到代理(broker)的客户端定义QoS,但是代理(broker)使用的QoS是接收方在订阅时定义的。比如,如果发送方使用的QoS 2,接收方使用QoS 1订阅,代理(broker)使用QoS 1发送消息到接收方。这就可能导致向接收方多次传递同一消息。

数据包标识符在每个客户端是唯一的

在一次指定客户端和代理(broker)的交互中,QoS 1和QoS 2使用的数据包标识符是唯一的。但是,在所有的客户端中不是唯一的。一旦一个流程结束,数据包标识符就可以再次使用。这就是为什么数据包标识符不需要超过65535,因为对于一个客户端来说,发送超过这个数量的消息且都没有完成是不太现实的。

使用QoS的最佳实践

经常被问到如何选择正确的QoS等级。选择合适的QoS等级依赖于具体的应用场景。下面是一些导则帮你做出合适的决定:

何时使用QoS 0

  • 发送方和接收方拥有完全或基本可靠的连接。QoS 0的一个经典用例是通过有线连接将测试客户端和前端应用程序连接到MQTT代理(broker).
  • 如果你不介意一些消息偶尔的丢失。一些消息的丢失是可接受的,如果数据不是那么重要或数据在较短间隔内发送。
  • 不需要消息队列。仅当断开连接的客户端具有QoS 1或QoS 2和持久会话时,才会为断开连接的客户端排队。

何时使用QoS 1

  • 你需要获取每条消息且你的用例能够处理重复消息。QoS 1是最常用的,因为它保证每条消息至少送达一次,但允许重复发送。当然,你的应用程序必须忍受重复并能够进行相应的处理。
  • 你无法承受QoS的开销。QoS 1传递消息的速度比QoS 2快得多。

何时使用QoS 2

  • 对你的程序来说,所有消息准确的接收一次非常重要。如果重复发送可能会损害应用程序用户或订阅的客户端。注意这其中的开销,QoS 2的交互会消耗更多的时间。

QoS 1和QoS 2的消息队列

对于离线的客户端,所有以QoS 1和QoS 2发送的消息都会排队,直到客户端再次可用。但是,只有当客户端有持续会话时,这些队列才可能。

结论

本文主要介绍了服务质量,即QoS。三个等级的QoS的工作原理,发送方和接收方的交互过程。对如何选择合适的QoS等级提了一些建议。接下来的文章,我们会介绍QoS相关的MQTT中的持续会话。

这篇关于MQTT服务质量-QoS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480758

相关文章

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

HTTP协议 HTTPS协议 MQTT协议介绍

目录 一.HTTP协议 1. HTTP 协议介绍 基本介绍: 协议:  注意: 2. HTTP 协议的工作过程 基础术语: 客户端: 主动发起网络请求的一端 服务器: 被动接收网络请求的一端 请求: 客户端给服务器发送的数据 响应: 服务器给客户端返回的数据 HTTP 协议的重要特点: 一发一收,一问一答 注意: 网络编程中,除了一发一收之外,还有其它的模式 二.HTT

【知识分享】MQTT实战-使用mosquitto客户端连接emqx服务器

一、简介     MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,旨在实现物联网设备之间的低带宽、高延迟的通信。MQTT协议设计简洁,使用TCP/IP协议进行通信,适用于各种网络环境,尤其适合在有限的网络带宽和不稳定的网络连接条件下进行通信。     MQTT的工作原理是基于发布/订阅模式的消息传递,它包括两个主要

基于 RocketMQ 的云原生 MQTT 消息引擎设计

作者:沁君 概述 随着智能家居、工业互联网和车联网的迅猛发展,面向 IoT(物联网)设备类的消息通讯需求正在经历前所未有的增长。在这样的背景下,高效和可靠的消息传输标准成为了枢纽。MQTT 协议作为新一代物联网场景中得到广泛认可的协议,正逐渐成为行业标准。 本次我们将介绍搭建在 RocketMQ 基础上实现的 MQTT 核心设计,本文重点分析 RocketMQ 如何适应这些变化,通过优化存储

MQTT协议中信息长度MSG len字段分析

截图自: 主要是说数据字节长度的计算: 每个字节由1个持续位和7个数据位组成:如果持续位为1,表示接下来的一个字节仍然表示长度的一部分 7个数据位表示的数据     0-127   共计128个数字 所以如上图的表格所示 1个字节,2个字节,3个字节,4个字节的数据范围 切记:MQTT长度的表示范围 最多使用4个字节  故这里存在着数据长度的限制  (不过真心牛掰! 试试Q

MQTT broker搭建并用SSL加密

系统为centos,基于emqx搭建broker,流程参考官方。 安装好后,用ssl加密。 进入/etc/emqx/certs,可以看到 分别为 cacert.pem CA 文件cert.pem 服务端证书key.pem 服务端keyclient-cert.pem 客户端证书client-key.pem 客户端key 编辑emqx配置:vim /etc/emqx/emqx.conf,添加s

构建智能门禁安防系统:树莓派 4B、OpenCV、SQLite 和 MQTT 的应用(代码示例)

一、项目概述 1.1 项目目标和用途 本项目旨在开发一个智能门禁安防系统,该系统利用摄像头和人脸识别技术,结合本地人脸库,实现对进出人员的自动识别和管理。系统能够实时记录进出人员的信息,并对未注册人员进行警报提示。通过与物联网平台的集成,用户可以远程监控和管理门禁系统,提升安全性和管理效率。 1.2 解决的问题和价值 传统的门禁系统往往依赖于钥匙或密码,存在安全隐患和管理不便的问题。本项目

MQTT.js 简述

MQTT.js 简述 简介 MQTT 是一种轻量级的消息传输协议,常用于物联网(IoT)设备间的通信。mqtt.js 是一个 JavaScript 库,支持在 Node.js 和浏览器中使用,用于通过 MQTT 协议与 MQTT Broker 进行通信。 安装 在 Node.js 中,可以通过以下命令安装: npm install mqtt --save 在浏览器中使用: <s

鹏程万里----mqtt

今天测试ubuntu安装mqtt服务器,其他都没啥说的,就是测试的时候 订阅里不要加-v,不然就会出现收不到数据 mosquitto_sub -h 192.168.10.80 -t "mqtt" 既然要搞mqtt那就必须得有个数据库来做数据持久化,于是我在ubuntu上装了个mongodb,遇到一点小问题 修改ip让外部能够访问,得修改./etc/mongodb.conf文件里的ip,

Mqtt消费端实现的几种方式

此处测试的mqtt的Broker是使用的EMQX 5.7.1,可移步至https://blog.csdn.net/tiantang_1986/article/details/140443513查看详细介绍 一、方式1 添加必要的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s