Netty 如何实现心跳检测?

Netty 面试题发布于

一、IdleStateHandler

Netty 提供 IdleStateHandler 检测空闲状态。

ch.pipeline().addLast(new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS));

三个参数:读空闲时间、写空闲时间、所有空闲时间。

二、事件触发

  • readerIdleTime 超时 → IdleStateEvent.READER_IDLE
  • writerIdleTime 超时 → IdleStateEvent.WRITER_IDLE
  • allIdleTime 超时 → IdleStateEvent.ALL_IDLE

三、处理心跳

public class HeartbeatHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
        if (evt instanceof IdleStateEvent) {
            IdleState state = ((IdleStateEvent) evt).state();
            if (state == IdleState.READER_IDLE) {
                ctx.close();  // 读超时,断开连接
            }
        }
    }
}

四、心跳机制

  • 客户端定时发心跳包,服务端收到不响应或回响应。
  • 服务端读超时未收到心跳,主动断开。
  • 客户端写超时未收到响应,主动重连。

五、TCP keepalive

系统级 TCP keepalive 默认 2 小时,不适合业务心跳。应用层心跳更灵活。