RPC安全可靠的异常重试

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

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

RPC框架的重试机制

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

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

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

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

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

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

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

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

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

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

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

相关推荐
小Tomkk4 小时前
Docker 部署 ClickHouse 教程
clickhouse·docker·rpc
zhuyasen1 天前
多维度详细比较 kratos、go-zero、goframe、sponge 框架
后端·http·微服务·rpc·golang
sumatch8 天前
RPC是什么?和HTTP区别?
网络协议·http·rpc
TravisBytes9 天前
深入解析:Docker 容器如何实现文件系统与资源的多维隔离?
docker·容器·rpc
mit6.82412 天前
[实现Rpc] 项目设计 | 服务端模块划分 | rpc | topic | server
网络·c++·笔记·rpc·架构
我看就这样吧14 天前
使用rpc绕过咸鱼sign校验
网络·网络协议·rpc
DanceDonkey14 天前
@LoadBalanced注解的实现原理
rpc·springcloud·resttemplate·客户端负载均衡
mit6.82414 天前
[实现Rpc] 环境搭建 | JsonCpp | Mudou库 | callBack()
网络·c++·笔记·网络协议·rpc
大G哥17 天前
记录一次RPC服务有损上线的分析过程
java·开发语言·网络·网络协议·rpc
Channing Lewis17 天前
RPC 简介
网络·网络协议·rpc