可靠性设计

  • 一、心跳机制(Ping-Pong双向心跳机制)
  • 二、重连机制
  • 三、重复登录保护
  • 三、消息缓存重发




一、心跳机制(Ping-Pong双向心跳机制)

        当读或者写心跳消息发生IO异常的时候,说明链路已经中断,此时需要立即关闭链路,如果是客户端需要重新发起连接,如果是服务端,需要清空缓存的半包消息,等待客户端重连链路。而且需要保证连续N此心跳检测都失败才认定链路已经损坏。

二、重连机制

        如果链路中断,等待INTERVAL时间后,由客户端发起重连操作,如果重连失败,间隔INTERVAL后再次发起重连,直至重连成功。

        为了保证服务端能够有充足的时间释放句柄(一个不变的对象存储着同一个对象随机随时可能会变的地址)资源,在首次断连时客户端需要等待INTERVAL时间之后再发起重连,而不是失败后就立即重连。
        为了保证句柄资源能及时释放,无论什么场景下的重连失败,客户端都必须保证自身的资源被及时释放。

三、重复登录保护

        当客户端握手成功之后,在链路处于正常状态下,不允许客户端重复登录,以防止客户端在异常状态下反复重连导致句柄资源被耗尽。为了防止由于服务端和客户端对链路状态理解不一致导致的客户端无法握手成功的问题,当服务连续N次心跳超时后需要主动关闭链路,清空客户端的地址缓存信息,以保证后续客户端可以重连成功,防止被重复登录保护机制拒绝掉。

三、消息缓存重发

        无论客户端还是服务端,当发生链路中断之后,在链路恢复之前,缓存在消息队列中待发送的消息都不能丢失,等链路恢复之后,重新发送这些消息,保证链路中断期间消息不丢失。