博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

RPC的优雅关闭(笔记四)

一、实现“优雅关闭”的原因

在服务重启的时候,对于服务调用方来说,存在以下两种情况:

1、服务调用方发送请求,目标服务已经下线,对于服务调用方来说,与目标节点的连接就会断开,此时服务调用方能够立马感知,并且在他的健康列表中会把这个节点给删除,因此该节点也不会被负载均衡选中。

2、服务调用方发送请求,目标服务正在关闭中,对于服务调用方来说,并不知道该节点正在关闭,两者的连接也没有断开,该节点还是存在服务调用方的健康列表中,因此该节点存在一定的概率被负载均衡选中从而调用,继而出错。

二、实现“优雅关闭”的方法

1、解决方案

服务提供方已经进入关闭流程,那么很多对象已经被销毁了,所以在关闭的时候,可以设置一个请求“挡板”,挡板的作用就是告诉服务调用方,服务提供方已经开始进入关闭流程了,不能再处理其他请求了。

2、实现流程

当服务提供方正在关闭的时候,如果之后还接受到新的业务请求,服务提供方直接返回一个特定的异常给服务调用方,该异常就是告诉服务调用方“我正在关闭,不能处理这个请求”,服务调用方接收到这个异常后,RPC框架就把这个节点从健康列表中挪出,并把该请求安全的重试到其他节点,从而实现对业务的无损处理。

3、流程示意图

posted @ 2021-08-15 17:02  疯狂打码  阅读(328)  评论(0编辑  收藏  举报