MQTT协议会话中消息重发的思路实现(个人理解)

MQTT协议会话中消息重发的思路实现(个人理解)

最近用netty写了一个mqtt服务器,基础功能基本实现。记录重发逻辑的理解

qos0消息发布流程图

在这里插入图片描述

qos1消息发布流程图

在这里插入图片描述

qos2消息发布流程图

在这里插入图片描述

MQTT协议会话中消息重发的思路实现(个人理解)

publish和pubrel的消息重发是针对订阅者而言的,重发是谁是发布者,才会担起这个责任,订阅者只是被动响应PUBACK、PUBREC或者PUBCOM

实现思路:

连接已连接状态:

​ 需要开启线程重发以下情况的消息:

1、没有收到puback、pubrec之前,要重发publish数据

​ 实现方案:出站write时就要开启周期性(假设设定每30s)重发任务,
​ 30s内收到puback、pubrec时(入站read),取消messageId对应的publish任务;

2、qos1的消息,第一种重发情况就已经解决;qos2收到pubrec时,发送pubrel。没有收到pubcom之前需要重发pubrel消息。

​ 实现方案:30s内收到pubrec时(入站read),取消对应的messageId的publish任务,
​ 要回复一个pubrel(出站write),同时开启周期性任务重发pubrel任务(假设设定每30s)
​ 30s内收到pubcom时(入站read),取消messageId对应的pubrel任务。
​ ps:所以收到pubrec后续只会重发pubrel消息,也就是说是不是收到pubrec之后就可以删除原来的publish本体消息了?或者保留下来没收到pubcom之前用作其他的用途。比如,需要msgId用完需要可重用,用作判断依据,所以我选择不删除。但收到pubcom消息时必须保证删除。

连接已断开状态(下次连接):

​ clearSession=1,清除对应客户端所有的会话历史消息
​ clearSession=0,下一次重连,publish、pubrel消息直接发送,重走注册周期性任务流程;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值