Netty初学九 心跳与空闲检测

news2025/2/11 15:49:08

一、网络问题

        1.连接假死:

        连接假死的现象是:在某一端看来,底层的Tcp连接已经断开,但是应用程序没有捕获到,会认为这条连接仍然是存在的。从TCP层面来说,只有收到四次握手数据包或者一个RST数据包才可以表示连接状态已经断开

        2.连接假死带来的问题:

        对于服务端来说,每隔连接都会消耗cpu和内存资源,大量的假死的连接会消耗完服务器的资源最终导致性能逐渐下降,程序崩溃

        对于客户端来说,连接假死会造成发送数据超时影响用户体验

        3.造成连接假死的原因:

        应用程序出现线程阻塞无法进行数据的读写

        客户端或者服务端网络相关的设备出现故障

        公网丢包

        4.服务端空闲检测:对于服务端来说,客户端的连接如果出现假死,那么服务端将无法收到客户端的数据,反之,这个连接还是活的,服务端对于连接假死的应对策略是空闲检测

           空闲检测:每隔一段时间,检测这段时间内是否有数据的读写,即服务端只需要检测一段时间内是否收到过客户端发来的数据

          Netty自带的IdleStateHandler的类来定义检测到假死连接之后的逻辑:

 public class IMIdleStateHandler extends IdleStateHandler {
    private static final int READER_IDLE_TIME = 15;
    public IMIdleStateHandler() {
        super(READER_IDLE_TIME, 0, 0, TimeUnit.SECONDS);
    }
    @Override
    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e
 vt) {
        System.out.println(READER_IDLE_TIME + "秒内未读到数据,关
闭连接");
        ctx.channel().close();
    }
}

        其中第一个参数是读空闲时间,第二个参数是写空闲时间,第三个参数是读写空闲时间,最后一个参数是,如果在它们定义的那些时间里都没有读或者写到数据就认为连接假死

        如果出现假死回调用channelIdle()方法,然后将这个Handler插到服务端Pipeline之前

        但是,现实问题是在一段时间内没有读到客户端的数据不一定就是连接假死而有可能是客户端确实没有数据发送过来,但是连接是正常的

        5.客户端定时发送心跳数据包:

        服务端在一段时间没没有收到客户端的数据,这个现象产生的原因可能是:

                连接假死

                非假死状态下确实没有发送数据

        可以在客户端定期发送数据包到服务端(心跳数据包)来排除第二种情况

        示例代码:

 public class HeartBeatTimerHandler extends ChannelInboundHandlerAdap
 ter {
private static final int HEARTBEAT_INTERVAL = 5;
@Override
   public void channelActive(ChannelHandlerContext ctx) throws Exception
 {
       scheduleSendHeartBeat(ctx);
       super.channelActive(ctx);
   }
   private void scheduleSendHeartBeat(ChannelHandlerContext ctx) {
       ctx.executor().schedule(() -> {
           if (ctx.channel().isActive()) {
               ctx.writeAndFlush(new HeartBeatRequestPacket());
               scheduleSendHeartBeat(ctx);
           }
       }, HEARTBEAT_INTERVAL, TimeUnit.SECONDS);
   }
}

        ctx.executor()方法返回的是当前Channel绑定的NIO线程,NIO线程有一个schedule()方法类似于jdk的延时任务机制,可以隔一段时间执行一个任务。上述代码实现了每隔5s向服务端发送一个心跳数据包,这个间隔时间通常要比服务端的空闲时间的一半短,一般可以定义为空闲检测时间的三分之一

        6.服务端回复心跳与客户端空闲检测:

 bootstrap
        .handler(new ChannelInitializer<SocketChannel>() {
            public void initChannel(SocketChannel ch) {
                // 空闲检测
                ch.pipeline().addLast(new IMIdleStateHandler());
                ch.pipeline().addLast(new Spliter());
                // ...

        如果在一段时间内客户端没有收到服务端发来的数据包,则可以判定这个连接为假死状态,因此,服务端的Pipeline中需要再加上一个Handler,这个处理无需登录,所以一般会将这个Handler放在AuthHandler前面

        HeartBeatRequestHandler:

@ChannelHandler.Sharable
public class HeartBeatRequestHandler extends
 SimpleChannelInboundHandler<HeartBeatRequestPacket> {
public static final HeartBeatRequestHandler INSTANCE = new HeartBea
 tRequestHandler();
private HeartBeatRequestHandler() {
}
@Override
 protected void channelRead0(ChannelHandlerContext ctx, HeartBeatReq
 uestPacket
 requestPacket) {
ctx.writeAndFlush(new HeartBeatResponsePacket());
}
}

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2295750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据分析如何做EDA

探索性数据分析&#xff08;EDA&#xff0c;Exploratory Data Analysis&#xff09;是数据分析过程中至关重要的一步&#xff0c;其目的是通过统计和可视化技术对数据进行初步分析&#xff0c;从而揭示数据的潜在模式、特征和异常值&#xff0c;并为后续的数据预处理、特征工程…

AD域控粗略了解

一、前提 转眼大四&#xff0c;目前已入职上饶一公司从事运维工程师&#xff0c;这与我之前干的开发有着很大的差异&#xff0c;也学习到了许多新的知识。今天就写下我对于运维工作中常用的功能——域控的理解。 二、为什么要有域控&#xff0c;即域控的作用 首先我们必须要…

【计算机网络】TCP/IP 网络模型有哪几层?

目录 应用层 传输层 网络层 网络接口层 总结 为什么要有 TCP/IP 网络模型&#xff1f; 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通…

【Flink实战】Flink -C实现类路径配置与实现UDF Jar

文章目录 1. 描述2. 使用语法3. -C 适用的 Flink 运行模式4. USING JAR 不可用 1. 描述 Flink 中的 -C 选项用于将 URL 添加到作业的类加载器中。URL可以指向本地、HTTP 服务器或 HDFS 等资源的Jar文件。 注意&#xff1a; 此处的classpath的url必须是一个能够在client&…

【东莞常平】戴尔R710服务器不开机维修分享

1&#xff1a;2025-02-06一位老客户的朋友刚开工公司ERP服务器一台戴尔老服务器故障无法开机&#xff0c;于是经老客户介绍找到我们。 2&#xff1a;服务器型号是DELL PowerEdge R710 这个服务器至少也有15年以上的使用年限了。 3&#xff1a;客户反馈的故障问题为&#xff1a;…

STM32自学记录(八)

STM32自学记录 文章目录 STM32自学记录前言一、ADC杂记二、实验1.学习视频2.复现代码 总结 前言 ADC 一、ADC杂记 ADC其实就是一个电压表&#xff0c;把引脚的电压值测出来&#xff0c;放在一个变量里。 ADC&#xff1a;模拟——数字转换器。 ADC可以将引脚上连续变化的模拟电…

Citespace之关键词爆发检测分析(进阶分析)

在开始citespace进行关键词爆发检测分析之前&#xff0c;如果不会使用citespace的&#xff0c;可以参考我之前这一篇博客&#xff1a; https://blog.csdn.net/m0_56184997/article/details/145536095?spm1001.2014.3001.5501 一、创建工程后进行设置 在创建好工程后&#xf…

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

NIO——网络编程

文章目录 非阻塞 vs 阻塞阻塞非阻塞多路复用 Selector好处创建绑定 Channel 事件监听 Channel 事件select 何时不阻塞 &#x1f4a1;处理 accept 事件事件发生后能否不处理&#x1f4a1; 处理 read 事件为何要 iter.remove()&#x1f4a1;cancel 的作用&#x1f4a1;不处理边界…

IDEA关联Tomcat,部署JavaWeb项目

将IDEA与Tomcat关联 创建JavaWeb项目 创建Demo项目 将Tomcat作为依赖引入到Demo中 添加 Web Application 编写前端和后端代码 配置Tomcat server&#xff0c;并运行

ChatGPT搜索免费开放:AI搜索引擎挑战谷歌霸主地位全面分析

引言 2025年2月6日&#xff0c;OpenAI宣布ChatGPT搜索功能向所有用户免费开放&#xff0c;且无需注册登录。这一重大举措在搜索引擎行业引发巨大反响&#xff0c;有观点认为"谷歌搜索时代即将结束"。本文将深入分析ChatGPT生成式AI搜索对谷歌搜索业务及全球搜索市场…

从0开始掌握Java开发框架:学习路线与系统指南

目录 1. Java 开发框架的分类1. Web 开发框架2. 持久层框架3. 依赖注入框架4. 微服务框架5. 测试框架 2. 主要框架的作用及关系&#xff08;1&#xff09;Spring Framework&#xff08;2&#xff09;Spring MVC&#xff08;3&#xff09;Spring Boot&#xff08;4&#xff09;M…

边缘计算网关驱动智慧煤矿智能升级——实时预警、低延时决策与数字孪生护航矿山安全高效运营

迈向智能化煤矿管理新时代 工业物联网和边缘计算技术的迅猛发展&#xff0c;煤矿安全生产与高效运营正迎来全新变革。传统煤矿监控模式由于现场环境复杂、数据采集和传输延时较高&#xff0c;已难以满足当下高标准的安全管理要求。为此&#xff0c;借助边缘计算网关的实时数据…

React Hooks 与 Class 组件相比有何优势

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Racecar Gym 总结

1.Racecar Gym 简介 Racecar Gym 是一个基于 PyBullet 物理引擎 的自动驾驶仿真平台&#xff0c;提供 Gymnasium&#xff08;OpenAI Gym&#xff09; 接口&#xff0c;主要用于强化学习&#xff08;Reinforcement Learning, RL&#xff09;、多智能体竞速&#xff08;Multi-Ag…

活动预告 |【Part1】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动&#xff0c;了解 Azure 如何为将工作负…

可视化大屏的热力图,显示热点事件最直观。

可视化大屏的热力图在显示热点事件方面之所以直观&#xff0c;主要有以下原因&#xff1a; 视觉呈现特点 颜色直观表意&#xff1a;热力图通过不同的颜色来表示数据的密度或强度。通常情况下&#xff0c;红色等暖色调表示高密度或高热度区域&#xff0c;代表热点事件发生较为…

认识Electron 开启新的探索世界一

一、Electron轻松入门 1.搭建开发环境&#xff1a; 一般情况下开发者会使用node.js来创建electron项目&#xff0c;node.js是一个基于Chrome V8引擎的javascript运行环境&#xff0c;所以首先需要到官网去下载安装node.js 下载链接&#xff1a;https://nodejs.org/enhttps://no…

每日一题洛谷P5733 【深基6.例1】自动修正c++

#include<iostream> #include<string> using namespace std; int main() {string t;cin >> t;for (int i 0; i < t.length(); i){if (t[i] > a && t[i] < z){t[i] A - a;}cout << t[i];}return 0; }

分组加密算法CLEFIA

目录 (1)加密算法 轮函数 F函数 线性变换 (2)解密算法 (3)密钥扩展算法 分组加密算法CLEFIA CLEFIA分组密码算法由日本Sony(索尼)公司设计开发,接口对应于128比特分组密码技术例如ISO/IEC18033-3国际标准和高级加密标准(AES)。算法的分组长度是128比特,密钥长度…