Netty 心跳与空闲监测

Netty-实现心跳机制-以简易手写RPC框架为例 所谓心跳机制,其本质作用就是保证服务端与客户端的连接的可用性。 当客户端出现宕机,或因网络故障无法连接工作时。服务端应该及时发现,并将该连接断开,避免服务端或重启后的客户端仍使用这个连接读写数据,造成异常。 为了实现这个功能,我们可以在客户端,一段事件没有向服务端写数据时,向服务端发送一个心跳包。服务端接收到该心跳包,则表示当前客户端仍在线。当服务端在一段事件后没有获取到来自客户端的心跳包时,则可判定客户端掉线,将与该客户端的连接断开。 Netty中为我们提供了IdleStateHandler类,我们可以用 阅读详情

​Netty 心跳 与 空闲 监测

微信公众号

 

王皓的GitHub:https://github.com/TenaciousDWang

 

        今天来说一下关于心跳与空闲检测,为什么需要说这两个东西呢?在因为在网络中凡是涉及到端到端的通信都会遇到一个问题就是假死。

 

        我们知道一个TCP连接建立需要三次握手,断开连接需要四次挥手,原理过程这里就不长篇大论了,通俗一点讲就是:

 

        三次握手

 

        男生:做我女朋友吧。

        女生:好的。

        男生:好的。(可以抱女生了)

 

        四次挥手

 

        男生:我们分手吧。

        女生:好的,我收拾一下(此时男生不能抱女生了)。

        女生:我收拾好了,我们分手。(此时女生不能抱男生了)。

        男生:好的。

 

        这里我们的假死主要是在四次挥手阶段,其中任何一个环节出现问题,都可能导致TCP底层断开后,应用层程序并没有捕获到,导致该连接假死,如果存在大量的假死连接没有关闭,就会导致在服务端浪费资源,导致性能下降,最终崩溃。

 

        服务端假死时,客户端发送数据无响应,一直在等待,影响客户端体验。导致连接假死有可能是程序问题,也有可能是因为网络原因,为了避免此类情况的发生,通常我们会使用心跳机制与空闲检测。

 

        接下来我们先来说一下服务端,Netty为我们提供了一个IdleStateHandler处理器,使用方法如下:

 

        

        我们继承父类IdleStateHandler,在构造方法内调用父类的构造函数。

 

        super(READER_IDLE_TIME, 0, 0, TimeUnit.SECONDS);

 

        第一个参数是读空闲时间,第二个参数为写空闲时间,第三个参数为读写空闲时间,第四个参数为时间单位,我们设置第一个读空闲时间为15秒,即十五秒内没有读取到该连接的数据,就判断该连接假死。第二和第三个参数我们设置为0,即忽略这两种情况。

 

        当判断为假死时,Netty会回调channelIdle方法,我们覆写该方法,直接关闭连接,释放资源。

 

 

        我们将空闲检测放在逻辑处理链最头上,优先判断,现在服务端15秒读取不到数据就会判断假死,为了防止误判,服务端需要每15秒内向服务端发送心跳数据。

 

        我们来为客户端创建一个定时发送心跳数据的处理器HeartBeatTimerHandler与心跳数据包对象。

 

            

 

        当连接建立时回调channelActive方法,我们使用executor方法返回当前channel绑定的NIO线程,使用schedule方法执行定时五秒发送一次,取的是服务端15秒空闲检测的三分之一,这个不强制,随意,但是要考虑到两端性能及网络问题。

 

        现在客户端向服务端定时发送心跳数据,服务端可以知道客户端连接是否假死了,同理客户端也需要知道服务端是否假死,原理基本一致,我们来看一下如何实现,首先来定义一个心跳响应数据包。

 

 

        在服务端创建一个接收心跳数据包,并返回心跳响应数据包的处理器。

 

 

        然后我们为客户端也添加一个IMIdleStateHandler处理器,跟服务端用同一个即可,15秒读取不到服务端心跳相应数据,则判定服务端假死,客户端也关闭连接,释放资源。

 

        以上就是关于Netty中如何做心跳及空闲检测的方式,希望这些netty的笔记能够帮到大家。

 

 

数字IC设计——功耗分析 功耗是数字IC芯片的一个重要指标 阅读详情

相关推荐

CoppeliaSim远程API实战:用Python控制仿真机器人,5步搞定外部通信

本文详细介绍了如何使用Python通过CoppeliaSim远程API控制仿真机器人,实现外部通信的5个关键步骤。从环境配置到双向通信模式,再到实战案例和性能优化技巧,帮助开发者高效连接算法开发与物理验证。特别对比了B0与传统API的性能差异,提升工业自动化项目的开发效率。

weixin_28733637的博客 366

Netty 连接假死、心跳检测

连接假死 网络设备出现故障,例如网卡,机房等,底层的TCP连接已经断开了,但应用程序没有感知到,仍然占用着资源。 公网网络不稳定,出现丢包。如果连续出现丢包,这时现象就是客户端数据发不出去,服务端也一直收不到数据,就这么一直耗着 应用程序线程阻塞,无法进行数据读写 问题: 假死的连接占用的资源不能自动释放 向假死的连接发送数据,得到的反馈是发送超时 解决方法: 可以添加IdleStateHandler对空闲时间进行检测,通过构造函数可以传入三个参数 readerIdleTimeSeconds

清风 3155

华为 S2600T 存储 3 种网络端口(H4/H5/串口)用途解析与故障恢复实战

本文深度解析华为S2600T存储设备的三种关键网络端口(H4/H5/串口)的功能用途与故障恢复方法。通过详细的配置指南和实战案例,帮助管理员掌握管理接口(H4)的日常运维、维护接口(H5)的高级应用以及串口的应急操作,提升存储设备的可靠性和维护效率。

weixin_30899023的博客 336

Netty 08【连接假死现象解决】

是 Netty 提供的一个用于处理连接空闲状态的处理器。当连接在一定时间内没有进行读、写或者读写操作时,IdleStateHandler。将触发相应的事件,可以通过重写 userEventTriggered。方法来处理这些事件。

WaaTong的博客 1236

【AI平台】n8n入门2:第一个工作流,调用本地大模型

n8n是一款开源的,专注于AI工作流构建,支持灵活的自定义与集成。就是可以把大模型和其他工具联合起来,这就厉害了。而且,免费功能又强大,目前很火,来研究一下。

正经教主是个热衷于正经学习分享的教主。 4531

分析4-20mA检查电路分析

本文介绍了一种工业领域常用的4-20mA电流信号调理电路,可将标准电流信号转换为适合MCU采集的电压信号。电路包含三个关键模块:首先通过10Ω取样电阻将4-20mA电流转换为0.04-0.2V电压;然后采用同向比例运算放大器KTA333-ST5进行信号放大;最后通过二阶有源低通滤波器滤除工业环境中的高频干扰。文章详细分析了各模块的工作原理和参数设计,并以压力传感器和温度变送器为例说明了实际应用中的参数调整方法。该电路具有抗干扰能力强、精度高等特点,适用于工业压力、温度等模拟量信号的采集处理。

qq_37999850的博客 1329

java项目用netty启动卡住_java用netty框架做服务端,有时候与客户端建立连接发消息会造成服务端假死,那是怎么原因?...

使用Netty做一个服务端,在SpringBoot启动后用FutureTask进行异步启动Netty。负责与物联网设备通信,有时候客户端与服务端通信时,造成服务端假死,网页访问速度慢的跟没有一样,那么发生假死的原因是是什么,怎么从解决。而且假死之前,没有抛出异常。不考虑在物联网设备上排查问题的方式。由于服务端的handler的内包含的代码信息量有点大,我就简要说明一下,目前的handler只有一个...

weixin_32688511的博客 1388

【FPGA教程案例59】深度学习案例6——基于FPGA的CNN卷积神经网络之整体实现

在课程,我们对的基本原理有了初步认识。在上一个课程,我们完成了CNN的Relu激活层、pool池化层、卷积层以及图像输入层的实现,如下图所示:在本课程中,我们将上述四个模块结合起来,构建一个简单的CNN卷积神经网络。...

FPGA/MATLAB学习教程/源码/项目合作开发 2637

Netty-心跳与空闲检测

网络问题 连接假死的现象是:在某一端(服务端或者客户端)看来,底层的 TCP 连接已经断开了,但是应用程序并没有捕获到,因此会认为这条连接仍然是存在的,从 TCP 层面来说,只有收到四次握手数据包或者一个 RST 数据包,连接的状态才表示已断开。 空闲检测 服务端:只需要检测一段时间内,是否收到过客户端发来的数据即可,Netty 自带的IdleStateHandler就可以实现这个功能。 public class MyIdleStateHandler extends ...

小毛贼_哪里逃 919

飞牛NAS1.1.19更新后SSH连不上?两步快速恢复连接

飞牛NAS1.1.19版本更新后SSH无法连接😟,实则是官方安全策略升级默认关闭了该服务,本文分享两步实操配置恢复SSH连接💻,还同步了官方的设备安全配置建议,帮助用户兼顾使用与设备防护🔒。

XiaoqiangClub的博客 2098

Scratch全攻略:从入门到实践的编程之旅

Scratch 是一款由麻省理工学院(MIT)开发的图形化编程工具 ,它诞生的初衷是为了让编程教育更加普及,尤其是让孩子们能够轻松接触和学习编程。与传统的基于文本代码的编程方式不同,Scratch 通过将编程指令以图形化的积木形式呈现,极大地降低了编程的门槛,让编程变得如同搭积木一样简单有趣。

邓邓子的博客 1万+

Netty心跳检测

客户端的心跳检测对于任何长连接的应用来说,都是一个非常基础的功能。要理解心跳的重要性,首先需要从网络连接假死的现象说起。

qq_25046827的博客 1368

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Netty——心跳监测机制

本文讲解了如何使用 Netty 实现心跳监测机制,并且还介绍了 IdleStateHandler 的原理。

qq_61350148的博客 1600

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Netty框架入门学习--心跳检测机制

问题 当客户端退出失去连接时,服务端会感知到客户端的这个行为,服务端的handlerRemoved就会得到调用。 但是实际情况中并不是这么简单,往往都是非常复杂的。比如一个手机客户端和服务端进行了一个长连接之后,当客户端应用没有退出,手机开启了飞行模式之后,服务端和客户端双方之间是感知不到已经断开连接,这个时候handlerRemoved是不会被调用的,服务端会以为与客户端还是保持连接的,这个时候...

return 1222

Netty 心跳机制示例 —— 服务端实现

在 Netty 中,心跳机制的核心组件是,它会监测连接的读空闲(READ_IDLE)、写空闲(WRITE_IDLE)和读写空闲(ALL_IDLE)状态。当触发这些空闲状态时,Netty 会生成一个事件,并交由相应的处理器来处理(通常是发送心跳包或关闭连接等)。

dhrmt的博客 1019

Netty——心跳机制与断线重连

在长连接模式下,为了保证系统的稳定行和可用性,心跳包和重连机制是必不可少的,让我们看看在Netty中怎么简单的实现吧

共勉 3986

017netty的心跳处理

package beat; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.han

Be_With_I的博客 215

netty4 如何建立心跳机制

netty4 如何建立心跳机制 1月16日厦门 OSC 源创会火热报名中,奖品多多哦 »   @石头哥哥 你好,想跟你请教个问题:  关于netty4如何建立心跳机制,我目前的实现是这样的: 服务端增加对空闲时间处理pipeline.addLast("ping", new IdleStateHandler(60, 15, 13,TimeU

gaoqiao1988的专栏 1521

netty心跳过程中 发送消息失败_Netty 心跳处理

传统的心跳包设计,基本上是服务端和客户端同时维护 Scheduler,然后双方互相接收心跳包信息,然后重置双方的上下线状态表。此种心跳方式的设计,可以选择在主线程上进行,也可以选择在心跳线程中进行,由于在进行业务调用过程中,此种心跳包是没有必要进行发送的,所以在一定程度上会造成资源浪费。严重的甚至会影响业务线程的操作。但是在 Netty 中是通过检测链路的空闲与否在进行的。链路分为读操作空闲,写操...

weixin_39946274的博客 574

Netty 进阶学习(十一)-- 扩展与源码

1、第一次握手,client 发送 SYN 到 server ,状态修改为 SYN_SEND ,server 收到,状态改变为 SYN_REVD,并将该请求放入 sync queue 队列。2、第二次握手,server 回复 SYN + ACK 给 client,client 收到,状态改变为 ESTABLISHED ,并且发送 ACK 给 server。我们就来看看 netty 中对下面的代码是怎样进行处理的。属于 SocketChannel 参数。来设置大小(NIO 通过。Gson 需要的依赖。

weixin_43989102的博客 599

使用Netty的心跳检测功能

运行效果 让Server端设置读空闲时间为5秒,写空间时间为7秒,读写空闲时间为13秒。 源码 Server public class IdleServer { public static void main(String[] args) throws InterruptedException { EventLoopGroup bossGroup = new NioEve...

MyException Blog 514

Netty剖析之心跳检测机制

什么是心跳检测机制? 心跳检测机制就是服务端会定时向客户端发送一个心跳检测包,或者客户端向服务端发送,以确保连接的有效性机制。 Netty提供了IdleStateHandler来进行心跳检测 IdleStateHandler IdleStateHandler是Netty提供的空闲状态处理器 参数说明: readerIdleTime:读的空闲时间,超出此时间就会发送一个心跳检测包,检测是否连接 w...

皓晨的架构笔记 544

Netty-心跳机制的实现-基于简易手写RPC框架

所谓心跳机制,其本质作用就是保证服务端与客户端的连接的可用性。 当客户端出现宕机,或因网络故障无法连接工作时。服务端应该及时发现,并将该连接断开,避免服务端或重启后的客户端仍使用这个连接读写数据,造成异常。 为了实现这个功能,我们可以在客户端,一段事件没有向服务端写数据时,向服务端发送一个心跳包。服务端接收到该心跳包,则表示当前客户端仍在线。当服务端在一段事件后没有获取到来自客户端的心跳包时,则可判定客户端掉线,将与该客户端的连接断开。 Netty中为我们提供了IdleStateHandler类,我们可以用

weixin_43424751的博客 324

Netty心跳检测机制

netty中提供了 tcp-keepalive 的设置: ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup,workerGroup) .channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG,128)

weixin_44778397的博客 410

netty的心跳检测实现

由于netty采用了事件机制,因此给链路监测和连接管理带来了一些麻烦,因此最好给链路加上心跳处理 (1) 服务器端关键点,主要在initpipe中和实现IdleStateAwareChannelHandler. pipeline.addLast("timeout", new IdleStateHandler(timer, 10, 10, 0));//此两项为添加心跳机制 10秒查

记事本 1万+

Netty 4.0 实现心跳检测和断线重连

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33829657的博客 293
上一篇: Docker(二)出门
下一篇: Nacos 使用docker启动
JavaBoy王皓
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值