RPC安全可靠的异常重试

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

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

RPC框架的重试机制

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

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

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

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

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

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

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

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

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

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

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

相关推荐
阿正的梦工坊6 小时前
深入理解 JSON-RPC 2.0:轻量级远程调用协议详解
rpc·json
进化中的刀盾兽3 天前
从零实现 C++ Json-Rpc(十):把消息交给真实连接——MuduoConnection 与 ConnectionFactory
c++·rpc
骑着蜗牛撵大象3275 天前
飞牛fnOS部署Damselfly:Compose编排、照片目录与7100固定访问
java·docker·rpc·dubbo·fnos·照片管理·damselfly
syagain_zsx7 天前
BRpc 二次封装:Channel 管理、服务管理与回调工厂
c++·学习·程序人生·rpc·谷歌
mister_guo7 天前
HTTP 和 RPC:从一次干饭说清它们的区别
网络协议·http·rpc
zzu123zsw7 天前
面对多 RPC 扇入超时崩溃:深入 asyncTool 核心 DAG 编排与线程池隔离防护
java·网络·spring boot·网络协议·rpc·并发编程
syagain_zsx7 天前
BRpc 搭建简单 rpc 服务器
服务器·c++·网络协议·rpc·protobuf·库
SatanII9 天前
K8s 存储与配置管理|Volume、ConfigMap、Secret 核心笔记
笔记·rpc·kubernetes
斌糖雪梨9 天前
registerListeners(); 方法详解
网络·网络协议·rpc
笨鸟先飞的橘猫10 天前
skynet——RPC 超时机制优化方案
游戏·rpc·skynet