我的mqtt协议和emqttd开源项目个人理解(7) - Qos==2是如何保证消息只收到一次的

简介: 我的mqtt协议和emqttd开源项目个人理解(7) - Qos==2是如何保证消息只收到一次的

只有QoS==1,2时候,才有Store(Msg)之说;QoS==0时没有。


我们以第一种action为例(注意这里第一种action存储的是message,第二种action存储的是message ID):

1 若client没收到来自sever的pubcomp:那么client将重发pubrel,意思是sever将收到两次pubrel;但是sever并不会将消息发送两次,因为在第一次将消息发送给订阅者之后,server将删除这条消息的内容(delete message),而消息的内容是在publish中传输的,而不是在pubrel中传输的;

2 若client没收到来自server的pubrec,那么client将重发publish,意思是sever将收到两次publish,但是这里sever只是存储了信息,而且后面在pubrec中会有消息的ID,而client可以根据两次ID是否相同来判断server收到了几次同样的消息。

综上所述,这就保证了server不会将消息重发。




对于QoS2,增加了一个PUBREL及PUBCOM的过程,这样可以保证server端只publish一条message给他的subscriber。但是QoS1是只要sever接收到message就会publish给他的subscriber,网络不好的时候sender是会重复发送相同的message的,server也就会重复publish相同的message给他的。


QoS2的server端处理逻辑有点特别:


如果sender没收到server的PUBRECV, sender 是会重发,但是对于头上一条message,server有两种处理方式:1, message存在本地,先不publish给subscriber;2,存下message ID,把message publish 给他的subscriber。


对于第一种处理方式,如果sender继续重发,且被收到(ID相同),那在server端只算一条message,继续等sender发PUBREL,这样server就保证只publish了一条message,而不是多条。


对于第二种处理方式,如果sender继续重发,且被收到,sever会检查它的message ID,如果重发过来的message ID是之前存过的,server就不会publish给他的subscriber,因为之前已经publish了。直接删除。





说白了,QoS==1,2时候,有Store(Msg)和唯一的MessageID来保证消息不会重复接收和发送!



 


相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
3天前
|
消息中间件 物联网 网络性能优化
MQTT常见问题之MQTT不支持5.0的协议如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
2天前
|
传感器 网络协议 Ubuntu
MQTT协议与EMQ
MQTT协议与EMQ
|
3天前
|
监控 网络性能优化 网络安全
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
38 1
|
3天前
|
物联网 Linux 开发工具
MQTT协议接入问题之连接失败如何解决
MQTT接入是指将设备或应用通过MQTT协议接入到消息服务器,以实现数据的发布和订阅;本合集着眼于MQTT接入的流程、配置指导以及常见接入问题的解决方法,帮助用户实现稳定可靠的消息交换。
160 2
|
3天前
|
JSON 物联网 开发工具
MQTT协议问题之如何搭建物联网空调的服务器
MQTT协议是一个轻量级的消息传输协议,设计用于物联网(IoT)环境中设备间的通信;本合集将详细阐述MQTT协议的基本原理、特性以及各种实际应用场景,供用户学习和参考。
85 1
|
3天前
|
消息中间件 网络协议 JavaScript
MQTT常见问题之微消息队列mqtt支持ipv6失败如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
3天前
|
消息中间件 物联网 Java
MQTT常见问题之微消息队列配置失败如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
3天前
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
42 2
|
3天前
|
消息中间件 Java
springboot整合消息队列——RabbitMQ
springboot整合消息队列——RabbitMQ
82 0
|
3天前
|
消息中间件 存储 运维
为什么选择云消息队列 RocketMQ 版
为什么选择云消息队列 RocketMQ 版
8 1