首页 > 其他分享 >研究MQTT通过Keep Alive来确认连接是否正常

研究MQTT通过Keep Alive来确认连接是否正常

时间:2023-02-23 11:11:45浏览次数:39  
标签:Alive Keep MQTT 重连 连接 客户端

MQTT是tcp连接,tcp连接的IsConnected记录的是上次网络IO的状态,很多时候连接都断了IsConnected依然是true

MQTT有个Keep Alive参数,可以理解为保活周期,这个参数官方的说法是客户端发送两次 MQTT 协议包之间的最大间隔时间

按照我的理解就是如果客户端和服务端长时间没有数据通讯(发送和接收),达到Keep Alive时间后,约定客户端就可以向服务端发送 PINGREQ 协议包用来判定连接是否正常,如果连接正常,则一切安好,如果连接不正常,客户端应当断开连接,这里的【约定,应当】估计是需要客户端开发完善的,我现在用的M2Mqtt类库貌似就实现了这个效果

Keep Alive参数在服务器也有效果,服务端在1.5个Keep Alive内,既没有收到客户端发布订阅报文,也没有收到PINGREQ心跳报文时,主动心跳超时会断开客户端TCP连接。

对于 Keep Alive 机制,我们还需要记住以下几点:

  • 如果在一个 Keep Alive 时间间隔内,Client 和 Broker 有过数据包传输,比如 PUBLISH,Client 就没有必要再使用 PINGREQ 了,在网络资源比较紧张的情况下这点很重要;
  • Keep Alive 值是由 Client 指定的,不同的 Client 可以指定不同的值;
  • Keep Alive 的最大值为 18 小时 12 分 15 秒;
  • Keep Alive 值如果设为 0 的话,代表不使用 Keep Alive 机制。

借鉴https://blog.csdn.net/qq997758497/article/details/90677479

由于超过Keep Alive时间后会发送PINGREQ协议包,网络IO更新了状态,此时的IsConnected就变得可信了,而且大部分类库应该都会有个连接断开事件,这样无论是自己定时轮询IsConnected,还是通过监控连接断开事件,都能准确得知道当前连接是否正常,发现连接断开后,就可以尝试连重连了

(如果使用定时器轮询重连,需要考虑如果重连发生阻塞,定时器会不停申请重连操作,可能会搞崩系统,因此推荐在断开事件中处理重连,如果只能轮询,那就需要想办法保证重连时不再申请新的重连,比如用延迟定时器,或者用锁+标志位控制)

 

标签:Alive,Keep,MQTT,重连,连接,客户端
From: https://www.cnblogs.com/luludongxu/p/17147219.html

相关文章

  • Zookeeper原生客户端操作
    在Linux系统中安装了Zookeeper服务器,对Zookeeper命令有一些了解的情况下,学习如何在客户端操作Zookeeper。目前,Zookeeper服务器有三种Java客户端:Zookeeper、Zkclient和Cura......
  • 理论:第十二章:Dubbo的运行原理,支持什么协议,与SpringCould相比它为什么效率要高一些,Zook
    Dubbo简单的介绍一下Dubbo?(Dubbo是什么)dubbo就是个服务调用的东东。为什么怎么说呢?因为Dubbo是由阿里开源的一个RPC分布式框架那么RPC是什么呢?就是不同的应用部署到......
  • Gunicorn + Flask Curl命令返回状态Connection: close转keep-alive的方法
    问题介绍:在实际的业务中,会存在CURL命令请求后返回值的header中的"Connection:close"的情况,这种情况下会导致每次请求都要重新建立连接。HTTP协议采用“请求-应答”模式......
  • k8s之keepalive+nginx高可用集群部署
    1、安装nginx、keepalivedyuminstallnginxkeepalived-y2、更新nginx配置文件stream{log_formatmain'$remote_addr$upstream_addr-[$time_local]$status$up......
  • zookeeper分布式锁代码实现
    packagecom.boe.lock;importorg.apache.log4j.BasicConfigurator;importorg.apache.log4j.Logger;importorg.apache.zookeeper.*;importorg.apache.zookeeper.......
  • zookeeper都有哪些使用场景?
    一、分布式协调这个其实是zookeeper很经典的一个用法,简单来说,就好比,你A系统发送个请求到MQ,然后B系统消费之后处理了。那么A系统如何知道B系统的处理结果?用zookeeper就......
  • 分布式锁用 Redis 还是 Zookeeper?
    为什么用分布式锁?在讨论这个问题之前,我们先来看一个业务场景:系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查......
  • zookeeper的入门
    zookeeper是一个分布式服务框架,是ApacheHadoop的一个子项目,它主要是来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务,状态同步服务,集群管理,分布式应用配置......
  • Zookeeper-ZKFC的原理和功能
    一、前言HADOOP2HA架构引入了ZKFC、Journalnode组件,本篇文章主要介绍ZKFC的功能和原理。HA架构支持两种切换方式:手动切换: 通过命令实现主备之间的切换,可以用HDFS升......
  • Rpc-实现Client对ZooKeeper的服务监听
    1、前言在上一篇文章中,完成了ZooKeeper注册中心,添加了一个简单的本地缓存但是,存在一些问题:当本地缓存OK,ZooKeeper对应服务有新的实例时,本地缓存不会自动更新当ZooKeep......