一、实现“优雅关闭”的原因
在服务重启的时候,对于服务调用方来说,存在以下两种情况:
1、服务调用方发送请求,目标服务已经下线,对于服务调用方来说,与目标节点的连接就会断开,此时服务调用方能够立马感知,并且在他的健康列表中会把这个节点给删除,因此该节点也不会被负载均衡选中。
2、服务调用方发送请求,目标服务正在关闭中,对于服务调用方来说,并不知道该节点正在关闭,两者的连接也没有断开,该节点还是存在服务调用方的健康列表中,因此该节点存在一定的概率被负载均衡选中从而调用,继而出错。
二、实现“优雅关闭”的方法
1、解决方案
服务提供方已经进入关闭流程,那么很多对象已经被销毁了,所以在关闭的时候,可以设置一个请求“挡板”,挡板的作用就是告诉服务调用方,服务提供方已经开始进入关闭流程了,不能再处理其他请求了。
2、实现流程
当服务提供方正在关闭的时候,如果之后还接受到新的业务请求,服务提供方直接返回一个特定的异常给服务调用方,该异常就是告诉服务调用方“我正在关闭,不能处理这个请求”,服务调用方接收到这个异常后,RPC框架就把这个节点从健康列表中挪出,并把该请求安全的重试到其他节点,从而实现对业务的无损处理。
3、流程示意图