本文档主要列举离会、关闭进程、断网、重连等会导致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 断链场景分析相关推荐

  1. 杭州趣链科技CEO李伟:区块链场景分析和实践

    2017年10月25日,由数据猿联合<清华金融评论>共同主办的"2017金融科技价值峰会--数据驱动金融商业裂变"在北京隆重召开.本文是杭州趣链科技CEO李伟关于区块链 ...

  2. 模块学习4:(2)MQTT协议连接、发布、订阅、心跳、断链等分析和代码实现,并且通过mqtt.fx连接服务器,使用wireshark抓包分析mqtt实现过程

    文章目录 一.MQTT控制报文的结构 (1)固定报头(类型/标志 + 剩余长度) 剩余长度(这个要注意下,要注意它的计算方法,有一点特殊) 可变报头 有效载荷 二.下面直接开整各个具体的报文(MQTT ...

  3. 应用使用Druid连接池经常性断链问题分析

    前段时间有应用使用Druid连接池经常的提示断链报错,整个问题排查分析过程很有意思.这里将Druid连接池.数据库层以及负载均衡层的配置分析下,记录整个问题的分析过程,同时梳理下Druid连接池的配置 ...

  4. WIFI连接失败以及断链问题定位分析

    大家好,我又来了~ 秀一波最近解BUG学到的东西:WIFI连接和断链.其实本文也不算问题分析,顶多算是问题定位吧?! 目录 1.密码错误导致的连接失败 2.关联被拒绝 3.热点未回复AUTH_RSP或 ...

  5. 2023王道数据结构P40题二.1,关于是否会断链的问题

    链表在删除一个结点p时为保证不断链,需要在删除前将p的前驱与后继链接起来,即p的前驱的指针域指向p的后继的地址,若将p的前驱记作q,可表示为q->next = p->next,也即为q-& ...

  6. 【区块链技术工坊28期实录】王灏:区块链场景应用研究(区块链+旅游)

    1,活动基本信息 1)题目: [区块链技术工坊28期]区块链场景应用研究(区块链+旅游) 2)议题: 随着全球经济的持续发展,旅游业展现出强大生命力.据WTTC与牛津 经济研究院统计,2017年增长3 ...

  7. 前车之鉴:半导体厂商是如何在SARS中避免“断链危机”的?

    新型冠状病毒的出现,总会让人想起十七年前的非典战役.同样的是全民动员,满城风雨,对病毒的恐惧,乃至对一整年经济形势的担忧,都沉甸甸地压在每个人心头. 对于资本市场来说,它们的表现也的确非常相似. 20 ...

  8. c语言断链隐藏dll,利用C++ R3层断链实现模块隐藏功能

    一.模块隐藏的实现原理 普通API查找模块实现思路:其通过查询在R3中的PEB(Process Environment Block 进程环境块)与TEB(Thread Environment Bloc ...

  9. 统一物品编码破解追溯“断链”困局

    在食品与医疗卫生行业,追溯监管常态化意义深远.一方面,作为政府部门有效管理手段,追溯越来越广泛地渗透到日常监管工作当中:另一方面,企业信息化水平不断提高,打造透明.高效的供应链,通过追溯提高管理水平成 ...

最新文章

  1. 如何在pycharm添加扩张工具
  2. ThreadPoolExecutor运转机制详解(转)
  3. [Windows驱动开发](三)基础知识——驱动例程
  4. 24帧动画走路分解图_人眼只能分辨24帧?我们来聊聊高刷新率的意义
  5. 《软件测试技术》课程第二周随笔
  6. 机器学习(十二)朴素贝叶斯分类
  7. Java电子书平滑翻页效果_(转载)Android 平滑和立体翻页效果1
  8. 【Kafka】kafka 偶然报错 NotLeaderForPartitionException
  9. 直接在 DNA 上执行 SQL 操作,已通过 PostgreSQL 验证
  10. php提交失败阻止提交数据,php – 在刷新浏览器时阻止重新提交提交
  11. mysql grant权限分配(转)。
  12. 管道泄漏监测系统分布式光纤测温技术方案
  13. 数值积分方法的总结(从简单梯形积分到龙贝格积分、自适应积分、高斯积分等)
  14. SQL SERVER 数据库日志已满,清理数据库日志的方法
  15. css flex布局问题width:auto
  16. 【apt】The following signatures couldn‘t be verified because the public key is not available
  17. 关于删除一条动态的同时删除这条动态的所有评论
  18. 软件的基本是要处理好”算法“及其基础(一)流-字-字符(包括某个数字、字母、符号和某个汉字等)-字符串-字节动态数组-字节-整数之间的转化关系和算法
  19. ThreeJS - 修复摄像机近距离模型或者摄像机在某些观察角度3D模型部分或者全部不可见的问题
  20. 谁是赢家(10 分)

热门文章

  1. cocos2dX 学习笔记——音乐、音效和进度条
  2. Flash 特效原理:图片平面墙
  3. html图片添加阴影效果图,使用css给图片添加阴影入门篇
  4. java 积分功能实现_简单积分系统的设计和实现
  5. 基于PHP+MYSQL的公司人事工资管理系统
  6. windows和linux 限速概述
  7. 零代码开发AI语音红外遥控
  8. 蝙蝠侠:黑暗骑士崛起 离线版(含数据包) v1.1.1
  9. 【科普】啥是物联网操作系统呢
  10. 【悟】终于入手PS4