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的笔记能够帮到大家。

 

 

C#创建COM组件,QT调用COM组件简单测试(VS2008+QT4.6.4) 一. C#创建组件: 1. VS2008新建一个项目,选择Visual C#, Class library 修改Properties下面的AssemblyInfo.cs文件,ComVisible属性设置为True,即:[assembly: ComVisible(true)] 2. 右击项目,选择“属性”, 选择“生成”选项卡,把“为COM互操作注册”勾选上 选择“签名”选项卡,把“ 阅读详情

相关推荐

聊一聊固态电池和钠离子电池新技术

总之,固态电池是一种“安全又高效的未来电池”,它的好处非常明显,但目前还处于研发阶段,离普及还有一段距离。未来,这两种技术可能会与锂离子电池并存,分别满足不同的市场需求。我尝试用最通俗易懂的语言将复杂的技术讲给大家听。钠离子电池和锂离子电池的工作原理很相似,但它用的是。固态电池和钠离子电池是两种正在研发和推广的。,它们有潜力解决现有锂离子电池的部分缺点。,而不是锂(Li)。

weixin_33324696的博客 3333

Netty 连接假死、心跳检测

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

清风 3155

将AD域服务从windows server 2008 R2 迁移到windows server 2019

添加一台windows 2019 的服务器并加入现有林的域中,并将角色升级为域控制器。然后迁移FSMO角色,使其成为PDC,然后降级旧DC,并提升域和林的功能级别。最后还要说下,Server 2008 R2我们还可以删除角色并退出当前域,这里就不做操作了。2)右键 mingling.com(我的域为mingling.com)--提升域级别功能。勾选 将域控制器添加到现有域,使用域管理员将DC2加入到现有的AD域。1)打开服务器管理器---工具---AD域和信任关系。2)运行域安装服务向导,选择下一步。

lionxam的博客 3659

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

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

WaaTong的博客 1236

02 - GRACE数据处理步骤简叙

本篇对GRACE数据处理的过程进行了介绍,简单叙述了进行数据各种改正的原因,可以帮助理解GRACE数据处理理论,本文借鉴了多篇优秀博士论文。希望可以对👪有所帮助。

weixin_43339605的博客 3348

使用Navicat连接Oracle数据库及ORA-12541: TNS: 无监听程序、ORA-28547:connection to server failed、ORA-12514:TNS报错解决方案

使用Navicat连接Oracle数据库及ORA-12541: TNS: 无监听程序、ORA-28547:connection to server failed、ORA-12514:TNS报错解决方案。

蓝多多的小仓库 5217

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

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

weixin_32688511的博客 1388

Silly Tavern酒馆ai角色卡与世界书导入超详细教程!

前几天,我在设置 Silly Tavern 的时候,想导入一个喜欢的角色卡,结果发现不少朋友其实已经下载好了角色资源,但却不知道怎么正确导入使用。这篇文章就作为一份完整的新手向教程,一步步教你如何在 Silly Tavern 中导入角色卡、世界书,并实现与 AI 角色的真实互动。如果你是第一次接触这个功能,建议先收藏慢慢看~点击菜单栏上的 图标,打开角色界面。初始状态下,你应该只看到默认角色 Seraphina。你可以先点击她的头像尝试聊天,也可以导入自己喜欢的角色。点击导入按钮,选择你下载好的角色卡(通

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2万+

Netty-心跳与空闲检测

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

小毛贼_哪里逃 919

RSA算法详解:万字文章详解RSA的加密与解密

为了彻彻底底的研究明白RSA算法,真的是。。煞(lei)费(si)苦(wo)心(le),首先我希望自己前前后后、彻彻底底的琢磨明白,其次我也希望我把他分享出来以后,大家都能读得懂,这篇文章真的是我迄今为止写的又臭又长的一篇文章了,但是我能保证的是,你读完了以后,绝对不会再问RSA是啥玩意儿了。。

布啦啦 7668

LVGL 丝滑菜单3(Silk Menu)

h。

摸鱼专家 90

Netty心跳检测

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

qq_25046827的博客 1368

基于电阻分压 + 电压跟随器的直流母线电压采样电路

摘要:本文介绍了一种基于电阻分压和电压跟随器的直流母线电压采样电路设计。该电路通过R38(240kΩ)和R41(20kΩ)组成的分压网络将高电压(如48V)降至3V,再经GS8331运放构成的电压跟随器进行隔离缓冲,最后通过RC滤波输出给ADC采集。重点分析了关键元件的选型要求:分压电阻需高精度、低温度系数;运放需高输入阻抗、低失调电压;滤波电容需稳定性好。该设计适用于工业电源、新能源BMS、变频器等需要高精度电压采样的应用场景。

qq_37999850的博客 890

Netty——心跳监测机制

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

qq_61350148的博客 1600

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

return 1222

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

dhrmt的博客 1019

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值