Netty ChannelInactive 断链场景分析
本文档主要列举离会、关闭进程、断网、重连等会导致sdk与服务端断开连接的场景的设计与实现,并试图解释其原理
1.Netty断链场景分析
1. Netty对断链的处理
简单来说Netty在检测到断开连接的情况下会抛出channelInactive事件(其实准确的说应该是de-register事件),这个事件会在pipeline的Handler中被传递和被处理,当然也可以选择不往下传递,即不调用fireChannelInactive(),对pipeline和handler处理事件等原理有兴趣可以看一下《netty in action》第16章,这里我们就重点关注哪些场景会触发channelInactive
2. ChannelInactive触发场景
- 客户端发送close帧(FIN包)
- 客户端关闭进程(RST包)
- 服务端或客户端主动调用channel.close()
以上为使用Netty官方示例测试得出的场景,需要注意的是直接断网并不会触发channelInactive,原因大概是由于直接断开网络并没有发送fin包,netty无法感知当前连接的存活状态,当然我们可以通过心跳超时来处理这种情况
另外心跳超时的情况也需要额外说明一下,在pipeline中添加IdleHandler可以配置一个自定义的心跳超时策略,例如我的服务中配置的是35s无新消息,当无新消息写入时,抛出一个心跳超时时间;但是心跳超时事件本身如果不去捕获netty是不会去做额外处理的,所以我的服务会在pipeline后面的heartbeatHandler中捕获心跳超时事件并主动关闭channel(对应上述第三种断链场景)
3. EventLoopGroup
顺带提一下Netty的线程处理模型,Netty主要分为两个线程的group,bossGroup和workerGroup,可以当成两个线程池,其中bossGroup一般只有一个线程,用来处理新连接的请求,而连接具体的IO和业务操作则放在workerGroup中完成。一般workerGroup中包含多个EventLoop(一个EventLoop可以理解成一个线程或者nio中的selector),多个channel可以注册到同一个EventLoop上,而对一个channel的处理从头至尾只会由同一个EventLoop来完成,想了解更多关于EventLoopGroup的细节也可以看下《netty in action》前几章的内容。这里提线程处理模型的原因主要是想说明,即使当客户端突然断开连接,netty也不会终止对前几个消息的处理,而是会等待前面的消息处理完再处理关闭事件,因为虽然netty是一个异步的框架,但是同一个channel的操作都是在同一个线程上顺序执行的
2.直接关闭客户端的场景
当客户端直接关闭/结束进程时,抓包信息如下
10.164.184.68 100.94.8.71 TCP 54 53435 → 80 [FIN, ACK] Seq=1 Ack=1 Win=1022 Len=0
100.94.8.71 10.164.184.68 TCP 60 80 → 53435 [FIN, ACK] Seq=1 Ack=2 Win=103 Len=0
10.164.184.68 100.94.8.71 TCP 54 53435 → 80 [ACK] Seq=2 Ack=2 Win=1022 Len=0
可以看到客户端主动发送了fin包,服务端会调用WsSubscribeHandler的channelInactive,触发一个自定义的channelInactiveEvent事件,之后主要执行bye和evict方法,其中bye主要是向mcs发送leaveRoom请求,evict主要是删除acs的相关缓存,这是断链场景下最简单的一个流程
Netty ChannelInactive 断链场景分析相关推荐
- 杭州趣链科技CEO李伟:区块链场景分析和实践
2017年10月25日,由数据猿联合<清华金融评论>共同主办的"2017金融科技价值峰会--数据驱动金融商业裂变"在北京隆重召开.本文是杭州趣链科技CEO李伟关于区块链 ...
- 模块学习4:(2)MQTT协议连接、发布、订阅、心跳、断链等分析和代码实现,并且通过mqtt.fx连接服务器,使用wireshark抓包分析mqtt实现过程
文章目录 一.MQTT控制报文的结构 (1)固定报头(类型/标志 + 剩余长度) 剩余长度(这个要注意下,要注意它的计算方法,有一点特殊) 可变报头 有效载荷 二.下面直接开整各个具体的报文(MQTT ...
- 应用使用Druid连接池经常性断链问题分析
前段时间有应用使用Druid连接池经常的提示断链报错,整个问题排查分析过程很有意思.这里将Druid连接池.数据库层以及负载均衡层的配置分析下,记录整个问题的分析过程,同时梳理下Druid连接池的配置 ...
- WIFI连接失败以及断链问题定位分析
大家好,我又来了~ 秀一波最近解BUG学到的东西:WIFI连接和断链.其实本文也不算问题分析,顶多算是问题定位吧?! 目录 1.密码错误导致的连接失败 2.关联被拒绝 3.热点未回复AUTH_RSP或 ...
- 2023王道数据结构P40题二.1,关于是否会断链的问题
链表在删除一个结点p时为保证不断链,需要在删除前将p的前驱与后继链接起来,即p的前驱的指针域指向p的后继的地址,若将p的前驱记作q,可表示为q->next = p->next,也即为q-& ...
- 【区块链技术工坊28期实录】王灏:区块链场景应用研究(区块链+旅游)
1,活动基本信息 1)题目: [区块链技术工坊28期]区块链场景应用研究(区块链+旅游) 2)议题: 随着全球经济的持续发展,旅游业展现出强大生命力.据WTTC与牛津 经济研究院统计,2017年增长3 ...
- 前车之鉴:半导体厂商是如何在SARS中避免“断链危机”的?
新型冠状病毒的出现,总会让人想起十七年前的非典战役.同样的是全民动员,满城风雨,对病毒的恐惧,乃至对一整年经济形势的担忧,都沉甸甸地压在每个人心头. 对于资本市场来说,它们的表现也的确非常相似. 20 ...
- c语言断链隐藏dll,利用C++ R3层断链实现模块隐藏功能
一.模块隐藏的实现原理 普通API查找模块实现思路:其通过查询在R3中的PEB(Process Environment Block 进程环境块)与TEB(Thread Environment Bloc ...
- 统一物品编码破解追溯“断链”困局
在食品与医疗卫生行业,追溯监管常态化意义深远.一方面,作为政府部门有效管理手段,追溯越来越广泛地渗透到日常监管工作当中:另一方面,企业信息化水平不断提高,打造透明.高效的供应链,通过追溯提高管理水平成 ...
最新文章
- 如何在pycharm添加扩张工具
- ThreadPoolExecutor运转机制详解(转)
- [Windows驱动开发](三)基础知识——驱动例程
- 24帧动画走路分解图_人眼只能分辨24帧?我们来聊聊高刷新率的意义
- 《软件测试技术》课程第二周随笔
- 机器学习(十二)朴素贝叶斯分类
- Java电子书平滑翻页效果_(转载)Android 平滑和立体翻页效果1
- 【Kafka】kafka 偶然报错 NotLeaderForPartitionException
- 直接在 DNA 上执行 SQL 操作,已通过 PostgreSQL 验证
- php提交失败阻止提交数据,php – 在刷新浏览器时阻止重新提交提交
- mysql grant权限分配(转)。
- 管道泄漏监测系统分布式光纤测温技术方案
- 数值积分方法的总结(从简单梯形积分到龙贝格积分、自适应积分、高斯积分等)
- SQL SERVER 数据库日志已满,清理数据库日志的方法
- css flex布局问题width:auto
- 【apt】The following signatures couldn‘t be verified because the public key is not available
- 关于删除一条动态的同时删除这条动态的所有评论
- 软件的基本是要处理好”算法“及其基础(一)流-字-字符(包括某个数字、字母、符号和某个汉字等)-字符串-字节动态数组-字节-整数之间的转化关系和算法
- ThreeJS - 修复摄像机近距离模型或者摄像机在某些观察角度3D模型部分或者全部不可见的问题
- 谁是赢家(10 分)