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监测相关推荐

  1. netty keepalive 和 idle 的关系

    实际应用中:结合起来使用,按需keepalive,保证不空闲,如果空闲,关闭链接. netty keepalive 和 idle 的三角关系? keepalive 就是类似于心跳时间,通俗点来说就是看 ...

  2. 【博学谷学习记录】超强总结,用心分享 | 架构师 Netty框架学习总结

    文章目录 前言 一.Netty · Netty简介 · Netty核心架构 · Netty中Reactor实现 1.工作流程 2.ChannelPipeline 和 ChannelHandler(开发 ...

  3. php redisson,排查redisson中订阅connection无故消失的问题

    最近在项目中使用了redis结合spring cache一起作了一个缓存,并使用了订阅功能来达到进程间的数据同步.但在测试使用过程中,发现第二天一来,本来应该工作的订阅同步并不能进行.当时没在意,简单 ...

  4. 聊聊 TCP 长连接和心跳那些事

    1 前言 可能很多 Java 程序员对 TCP 的理解只有一个三次握手,四次挥手的认识,我觉得这样的原因主要在于 TCP 协议本身稍微有点抽象(相比较于应用层的 HTTP 协议):其次,非框架开发者不 ...

  5. TCP的长连接与短连接

    转自:https://blog.csdn.net/weixin_39850699/article/details/109903631 1 前言 可能很多 Java 程序员对 TCP 的理解只有一个三次 ...

  6. 【verilog学习23】HDLBits:Circuits_Sequential Logic_Finite State Machines

    [HDLBits]Circuits_Sequential Logic_Finite State Machines I FSM 1 (asynchronous reset) (Fsm1) 1.代码编写 ...

  7. 即时消息IM系统设计

    1.确定需求 一对一聊天or群聊 群聊人数上限 发送消息大小限制 是否需要端到端加密 聊天记录存储时间 2.设计 聊天室功能设计 聊天室服务必须支持以下功能: •接收来自其他客户端的消息. •为每条消 ...

  8. java - (二)netty 心跳监测机制

    1.心跳检测机制 1.1 定时断线重连 客户端断线重连机制 客户端数量多,且需要传递的数据量级较大.可以在周期性的发送数据的时候,使用.要求对数据的即时性不高的时候,才可使用. 优点:可以使用数据缓存 ...

  9. (C# TCP异步)客户端异常断开,服务器利用KeepAlive监测

    (C# TCP异步)客户端异常断开,服务器利用KeepAlive监测 参考文章: (1)(C# TCP异步)客户端异常断开,服务器利用KeepAlive监测 (2)https://www.cnblog ...

最新文章

  1. FPGA(4)晶振与计数器 -- 实现定时器(led定时闪烁、蜂鸣器频率控制(单响)、蜂鸣器报警(频带控制,多响))
  2. Python图形开发之PIL
  3. Jsp+Servlet+JavaBean经典MVC模式理解
  4. Angularjs Services
  5. 洛谷 - P2754 [CTSC1999]家园(最大流+并查集)
  6. Magento 自定义后台menu Insert dynamical menu in Magento’s Admin
  7. mysql5.6 pid_MySQL5.6启动报错The server quit without updating PID file
  8. C#坏习惯:通过不好的例子学习如何制作好的代码——第5部分
  9. SSM项目启动报错More than one fragment with the name [spring_web] was found. This is not legal with relativ
  10. 小白入门使用Nginx基础的常用操作
  11. 信号与系统 matlab综合实验 pdf,《信号与系统——MATLAB综合实验》 谷源涛-第三讲.pdf...
  12. Python 爬取多玩图库
  13. Adobe Dreamweaver CS6 安装教程详解「附pj文件」
  14. 计算机按电源键无法反应,电脑无法开机怎么办 按电脑开机键也没反应的原因及处理解决办法...
  15. [原] 写作及开发环境设置
  16. 2017年年终总结 韩俊强的博客
  17. 小学生计算机校本课程教材,二年级校本课程教材
  18. CentOS虚拟机更改NAT网关及IP地址信息
  19. 微信小程序 细分_如何将细分网络模型与iPhone应用程序集成
  20. 第三篇:用SOUI能做什么?

热门文章

  1. 怎样看K线图(实图详解)
  2. 不论你技术多牛逼,30岁后,这3件事越早做越好!
  3. Android Studio在xml文件中编写代码时,关键词没有代码提示补全
  4. 神经网络学习小记录69——Pytorch 使用Google Colab进行深度学习
  5. java开源cad_寻找 AutoCAD 替代品,5款免费开源 CAD 软件推荐
  6. 数据结构(C语言版)学习笔记2-单链表
  7. 如何排除 Internet Explorer 中的脚本错误
  8. 对Softmax函数的理解
  9. ROS2之机器人辅助医疗 (医护服务机器人)
  10. zipfile java_java 解zip文件(ZipFile) - 蒋剑锋的专栏-java技术 - CSDN博客