RPC安全可靠的异常重试

当调用方调用服务提供方,由于网络抖动导致的请求失败,这个请求调用方希望执行成功。

调用方应该如何操作?catch异常再发起一次调用?显然不够优雅。这时可以考虑使用RPC框架的重试机制

RPC框架的重试机制

RPC重试机制:当调用端发起的请求失败时,RPC框架自身可以进行重试,再重新发送请求,用户可以自行设置是否开启重试以及重试的次数。

RPC框架的重试机制就是调用端发现请求失败时捕获异常,之后触发重试,不是所有异常都触发重试,因为这个异常可能是服务提供方抛回来的业务异常,应该正常返回给动态代理。

在触发重试之前对捕获的异常进行判定,只有符合重试条件的异常才能触发重试,比如网络超时异常、网络连接异常等等。

在使用RPC框架的时候,确保被调用的服务的业务逻辑是幂等的,才能考虑根据事件情况开启RPC框架的异常重试功能。

如何在约定时间内安全可靠地重试?

连续的异常重试可能会出现一种不可靠的情况,那就是连续的异常重试并且每次处理的请求时间比较长,最终会导致请求处理的时间过长,超出用户设置的超时时间。

调用端的请求超时时间设置为5s,结果连续重试3次,每次都耗时2s,那最终这个请求的耗时是6s,那这样的话,调用端设置的超时时间就不准确了。

最直接的解决方式:在每次重试后都重置一下请求的超时时间。当调用端发起RPC请求时,如果发送请求发生异常并触发了异常重试,先判定下这个请求是否已经超时,如果已经超时了就直接返回超时异常,否则就先重置下这个请求的超时时间,之后再发起重试。

发起重试、负载均衡选择节点的时候,去掉重试之前出现过问题的那个节点,以保证重试的成功率

有些服务端抛出的业务异常,调用端也可能发起重试。 可以加个重试异常白名单,用户可以将允许重试的异常加入到这个白名单中。

当调用端发起调用,并且配置了异常重试策略,RPC框架捕获到异常之后。如果这个异常是RPC框架允许重试的异常 ,或者这个异常类型存在于可重试异常的白名单中,就允许对这个请求进行重试。

相关推荐
kaixin_learn_qt_ing2 小时前
了解RPC
网络·网络协议·rpc
BUG研究员_1 天前
LoadBalancer负载均衡和Nginx负载均衡区别理解
nginx·rpc·负载均衡
大霸王龙2 天前
远程过程调用(RPC,Remote Procedure Call)是一种协议
网络·python·网络协议·rpc
大霸王龙2 天前
Python中流行的RPC(Remote Procedure Call,远程过程调用)框架主要有以下几个:
网络·网络协议·rpc
阿杰同学4 天前
Docker核心概念总结
docker·容器·rpc
_nirvana_w_4 天前
深入探索 C++ 编程技巧:从案例中学习高效实践
c++·学习·rpc
jjw_zyfx5 天前
python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django
python·rpc·rabbitmq
凌鲨5 天前
OpenLinkSaas 2025年1月开发计划
rpc·go·个人开发
p-knowledge6 天前
容器设计模式:Sidecar
网络协议·设计模式·rpc
zfoo-framework6 天前
rpc设计的再次思考20251215(以xdb为核心构建游戏框架)
rpc