Netty IdleStateHandler心跳机制

心跳机制

心跳是在 TCP 长连接中,客户端和服务端定时向对方发送数据包通知对方自己还在线,保证连接的有效性的一种机制;

在服务器和客户端之间一定时间内没有数据交互时,即处于 idle 状态时,客户端或服务器会发送一个特殊的数据包给对方,当接收方收到这个数据报文后,也立即发送一个特殊的数据报文,回应发送方,此即一个 PING-PONG 交互。自然地,当某一端收到心跳消息后,就知道了对方仍然在线,这就确保 TCP 连接的有效性。

心跳实现

使用 TCP 协议层的 Keeplive 机制,但是该机制默认的心跳时间是2小时,依赖操作系统实现不够灵活;

应用层实现自定义心跳机制,比如 Netty 实现心跳机制。

IdleStateHandler 心跳检测实例

服务端

服务端添加 IdleStateHandler 心跳检测处理器,并添加自定义处理 Handler 类实现 userEventTriggered() 方法作为超时事件的逻辑处理;

设定 IdleStateHandler 心跳检测每五秒进行一次读检测,如果五秒内 ChannelRead() 方法未被调用则触发一次 userEventTrigger() 方法;

ServerBootstrap b= new ServerBootstrap();
b.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
        .option(ChannelOption.SO_BACKLOG,1024)
        .childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel socketChannel) throws Exception {
                socketChannel.pipeline()
                    .addLast(new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS));
                socketChannel.pipeline().addLast(new StringDecoder());
                socketChannel.pipeline().addLast(new HeartBeatServerHandler());
            }
        });

自定义处理类 Handler 继承 ChannlInboundHandlerAdapter,实现其 userEventTriggered() 方法,在出现超时事件时会被触发,包括读空闲超时或者写空闲超时。

class HeartBeatServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) 
        throws Exception {
        if (evt instanceof IdleStateEvent){
            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state() == IdleState.READER_IDLE){
               // ...
            }
        } else {
            super.userEventTriggered(ctx,evt);
        }
    }
}

客户端

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。