Netty如何实现 keepalive和idle监测
1 为什么需要keepalive ?
- 类比如下场景
2 怎么设计keepalive
以TCP keepalive为例
TCP keepalive 核心参数:
# sysctl -algrep tcp_ keepalive
net.ipv4.tcp_ keepalive_ time = 7200 问题出现概率小,没有必要频繁
net.ipv4.tcp_ keepalive_ intvl= 75
net.ipv4.tcp_ keepalive_ probes= 9 判断需谨慎,不能武断
当启用( 默认关闭) keepalive 时,TCP在连接没有数据通过的7200秒后发送keepalive消息,当探测没有确认按75秒的重试频率重发,一直发 9个探测包都没有确认,连接失效。
所以总耗时一般为: 2小时11分钟(7200秒+xxs)
3 为什么还需要应用层keepalive?
协议分层
各层关注点不同:
- 传输层关注是否“通”
- 应用层关注是否可服务
类比前面的电话订餐例子,电话能通,不代表有人接
服务器连接在,但是不一定可以服务(例如服务不过来等)。
TCP层的keepalive默认关闭
且经过路由等中转设备keepalive包可能会被丢弃。
TCP层的keepalive时间太长
默认>2小时,虽然可改,但属于系统参数,改动影响所有应用。
HTTP属于应用层协议,但是常常听到名词“HTTP Keep-Alive "指的是对长连接和短连接的选择:
- Connection : Keep-Alive长连接(HTTP/1.1默认长连接,不需要带这个header)
- Connection : Close短连接
4 Idle监测
为何要有 idle 检测
假设你开个饭店,客户订餐电话通后,订餐的说了订餐要求,说着说着对方就不讲话了。
你并不会立马问:你还在吗?而是会稍微等待一定的时间, 在这个时间内看看对方还会不会说话(Idle 检测) 。
如果还不说,认定对方存在问题(Idle) ,于是开始
- 问“你还在么?”(keepalive )
- 或者问都不问干脆直接挂机(关闭连接)
ldle监测,只是负责诊断,诊断后,做出不同的行为,决定ldle监测的最终用途:
发送keepalive :一般用来配合keepalive,减少keepalive消息
Keepalive设计演进 V2
- V1定时keepalive消息:keepalive消息与服务器正常消息交换完全不关联,定时就发送
- V2空闲监测:有其他数据传输的时候,不发送keepalive,无数据传输超过一定时间,判定为Idle,再发keepalive
什么是 idle
如果是直接关闭连接
- 快速释放损坏的、恶意的、很久不用的连接,让系统时刻保持最好的状态
- 简单粗暴,客户端可能需要重连。
所以在实际应用 Netty 会结合起来使用。按需keepalive,保证不会空闲,如果空闲,关闭连接。
5 Netty中开启TCP keepalive和Idle检测
开启keepalive:
Server 端开启 TCP keepalive
bootstrap.childOption(ChannelOption.S0_ KEEPALIVE,true)
bootstrap.childOption(NioChannelOption.of(StandardSocketOptions.SO_KEEPALIVE), true)
提示: .option(ChannelOption.SO_KEEPALIVE,true) 存在但是无效
开启不同的 idle Check:
ch.pipeline().addLast( "idleCheckHandler", newldleStateHandler(0, 20, 0, TimeUnit.SECONDS));
Netty如何实现 keepalive和idle监测相关推荐
- netty keepalive 和 idle 的关系
实际应用中:结合起来使用,按需keepalive,保证不空闲,如果空闲,关闭链接. netty keepalive 和 idle 的三角关系? keepalive 就是类似于心跳时间,通俗点来说就是看 ...
- 【博学谷学习记录】超强总结,用心分享 | 架构师 Netty框架学习总结
文章目录 前言 一.Netty · Netty简介 · Netty核心架构 · Netty中Reactor实现 1.工作流程 2.ChannelPipeline 和 ChannelHandler(开发 ...
- php redisson,排查redisson中订阅connection无故消失的问题
最近在项目中使用了redis结合spring cache一起作了一个缓存,并使用了订阅功能来达到进程间的数据同步.但在测试使用过程中,发现第二天一来,本来应该工作的订阅同步并不能进行.当时没在意,简单 ...
- 聊聊 TCP 长连接和心跳那些事
1 前言 可能很多 Java 程序员对 TCP 的理解只有一个三次握手,四次挥手的认识,我觉得这样的原因主要在于 TCP 协议本身稍微有点抽象(相比较于应用层的 HTTP 协议):其次,非框架开发者不 ...
- TCP的长连接与短连接
转自:https://blog.csdn.net/weixin_39850699/article/details/109903631 1 前言 可能很多 Java 程序员对 TCP 的理解只有一个三次 ...
- 【verilog学习23】HDLBits:Circuits_Sequential Logic_Finite State Machines
[HDLBits]Circuits_Sequential Logic_Finite State Machines I FSM 1 (asynchronous reset) (Fsm1) 1.代码编写 ...
- 即时消息IM系统设计
1.确定需求 一对一聊天or群聊 群聊人数上限 发送消息大小限制 是否需要端到端加密 聊天记录存储时间 2.设计 聊天室功能设计 聊天室服务必须支持以下功能: •接收来自其他客户端的消息. •为每条消 ...
- java - (二)netty 心跳监测机制
1.心跳检测机制 1.1 定时断线重连 客户端断线重连机制 客户端数量多,且需要传递的数据量级较大.可以在周期性的发送数据的时候,使用.要求对数据的即时性不高的时候,才可使用. 优点:可以使用数据缓存 ...
- (C# TCP异步)客户端异常断开,服务器利用KeepAlive监测
(C# TCP异步)客户端异常断开,服务器利用KeepAlive监测 参考文章: (1)(C# TCP异步)客户端异常断开,服务器利用KeepAlive监测 (2)https://www.cnblog ...
最新文章
- FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响))
- Python图形开发之PIL
- Jsp+Servlet+JavaBean经典MVC模式理解
- Angularjs Services
- 洛谷 - P2754 [CTSC1999]家园(最大流+并查集)
- Magento 自定义后台menu Insert dynamical menu in Magento’s Admin
- mysql5.6 pid_MySQL5.6启动报错The server quit without updating PID file
- C#坏习惯:通过不好的例子学习如何制作好的代码——第5部分
- SSM项目启动报错More than one fragment with the name [spring_web] was found. This is not legal with relativ
- 小白入门使用Nginx基础的常用操作
- 信号与系统 matlab综合实验 pdf,《信号与系统——MATLAB综合实验》 谷源涛-第三讲.pdf...
- Python 爬取多玩图库
- Adobe Dreamweaver CS6 安装教程详解「附pj文件」
- 计算机按电源键无法反应,电脑无法开机怎么办 按电脑开机键也没反应的原因及处理解决办法...
- [原] 写作及开发环境设置
- 2017年年终总结 韩俊强的博客
- 小学生计算机校本课程教材,二年级校本课程教材
- CentOS虚拟机更改NAT网关及IP地址信息
- 微信小程序 细分_如何将细分网络模型与iPhone应用程序集成
- 第三篇:用SOUI能做什么?
热门文章
- 怎样看K线图(实图详解)
- 不论你技术多牛逼,30岁后,这3件事越早做越好!
- Android Studio在xml文件中编写代码时,关键词没有代码提示补全
- 神经网络学习小记录69——Pytorch 使用Google Colab进行深度学习
- java开源cad_寻找 AutoCAD 替代品,5款免费开源 CAD 软件推荐
- 数据结构(C语言版)学习笔记2-单链表
- 如何排除 Internet Explorer 中的脚本错误
- 对Softmax函数的理解
- ROS2之机器人辅助医疗 (医护服务机器人)
- zipfile java_java 解zip文件(ZipFile) - 蒋剑锋的专栏-java技术 - CSDN博客