当前位置:   article > 正文

Netty是如何实现TCP心跳机制与断线重连的_基于netty的心跳与断线重连

基于netty的心跳与断线重连

本文来说下Netty 是如何实现 TCP 心跳机制与断线重连的


什么是心跳机制HeartBeat

在 TCP 长连接 keepAlive 的应用场景下,client 端一般不会主动关闭它们之间的连接,Client 与 Server 之间的连接如果一直不关闭的话,随着客户端连接越来越多,Server 早晚有扛不住的时候,这时候 Server 端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致 Server 端服务受损

所谓心跳机制 / 心跳检测, 即在 TCP长连接中 , 客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线, 以确保 TCP连接的有效性.


如何实现心跳机制

我们可以通过两种方式实现心跳机制:

使用 TCP 协议层面的 keepalive 机制。在 Netty 中使用该策略:

.childOption(ChannelOption.SO_KEEPALIVE, true); 
  • 1

在应用层上实现自定义的心跳机制.,虽然在 TCP 协议层面上, 提供了 keepalive 保活机制, 但是使用它有几个缺点:

  • 它不是 TCP 的标准协议, 并且是默认关闭的.
  • TCP keepalive 机制依赖于操作系统的实现, 默认的 keepalive 心跳时间是 两个小时, 并且对 keepalive 的修改需要系统调用(或者修改系统配置), 灵活性不够.
  • TCP keepalive 与 TCP 协议绑定, 因此如果需要更换为 UDP 协议时, keepalive 机制就失效了.

虽然使用 TCP 层面的 keepalive 机制比自定义的应用层心跳机制节省流量, 但是基于上面的几点缺点, 一般的实践中, 人们大多数都是选择在应用层上实现自定义的心跳,一般我们自己实现的大致策略是这样的:

  • Client 启动一个定时器,不断向客户端发送心跳
  • Server 收到心跳后,做出回应;
  • Server 启动一个定时器,判断 Client 是否存在,这里做判断有两种方法:时间差和简单标识。

① 时间差:

  • 收到一个心跳包之后记录当前时间;
  • 判断定时器到达时间,计算多久没收到心跳时间 = 当前时间 - 上次收到心跳时间。如果该时间大于设定值则认为超时。

② 简单标识:

  • 收到心跳后设置连接标识为 true
  • 判断定时器到达时间,如果未收到心跳则设置连接标识为false

下面我们来看看基于 Netty 如何实现应用层上的心跳机制

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/242077
推荐阅读