「这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战」。
点赞再看,养成习惯👏👏
一、前言
由于在通信层的网络连接的不可靠性,比如:网络闪断,网络抖动等,经常会出现连接断开。这样对于使用长连接的应用而言,当突然高流量冲击势必会造成进行网络连接,从而产生网络堵塞,应用响应速度下降,延迟上升,用户体验较差。
在通信层的高可用设计中,需要保活长连接的网络,保证通信能够正常。一般有两种设计方式:
- 利用TCP提供的连接保活特性
- 应用层做连接保活
二、TCP连接保活性的局限
TCP协议层面提供了KeepAlive的机制保证连接的活跃,但是其有很多劣势:
- 该保活机制非TCP协议的标准,默认是关闭
- 该机制依赖操作系统,需要进行系统级配置,不够灵活方便
- 当应用底层传输协议变更时,将无法适用
由于以上的原因,绝大多数的框架、应用处理连接的保活性都是在应用层处理。目前的主流方案是心跳检测,断线重连。
在上一篇文章《『Netty核心』Netty心跳机制》已经介绍Netty是如何实现心跳检测机制的。
三、断线重连
断线重连是指由于网络波动造成用户间歇性的断开与服务器的连接,待网络恢复之后服务器尝试将用户连接到上次断开时的状态和数据。
当心跳检测发现连接断开后,为了保证通信层的可用性,仍然需要重新连接,保证通信的可靠。对于短线重连一般有两种设计方式比较常见:
- 通过额外的线程定时轮循所有的连接的活跃性,如果发现其中有死连接,则执行重连
- 监听连接上发送的断开事件,如果发送则执行重连操作
四、Netty断线自动重连实现
- 客户端启动连接服务端时,如果网络或服务端有问题,客户端连接失败,可以重连,重连的逻辑加在客户端。
- 系统运行过程中网络故障或服务端故障,导致客户端与服务端断开连接了也需要重连,可以在客户端处理数据的Handler的
channelInactive
方法中进行重连。
1 | java复制代码public class NettyClient { |
实现自定义的ChannelInboundHandlerAdapter
1 | java复制代码public class NettyClientHandler extends ChannelInboundHandlerAdapter { |
本文转载自: 掘金