myrpc 学习笔记-008 重试机制
项目地址 欢迎访问
笔记总览 myrpc 学习笔记-001 实现简易版 rpc myrpc 学习笔记-002 配置加载 myrpc 学习笔记-003 Mock 服务代理 myrpc 学习笔记-004 序列化实现和 SPI 机制 myrpc 学习笔记-005 注册中心 myrpc 学习笔记-006 自定义协议 myrpc 学习笔记-007 负载均衡 myrpc 学习笔记-008 重试机制 myrpc 学习笔记-009 容错机制 myrpc 学习笔记-0010 启动机制和注解驱动
架构图v8.0.0
- 实现重试策略
- 支持不重试 固定时间间隔 重试策略
- 支持自定义重试策略

这是 RPC 框架的重试机制的具体实现,负责在调用失败时自动重试,提升调用成功率,基于 Guava Retrying 实现,支持 不重试 / 固定间隔重试 两种策略,可扩展、可配置、SPI 加载。
一、模块结构
▼text复制代码fault.retry/ ├── RetryStrategy.java 重试策略接口 ├── NoRetryStrategy.java 不重试策略 ├── FixedIntervalRetryStrategy.java 固定时间间隔重试 ├── RetryStrategyFactory.java 重试策略工厂(SPI) └── RetryStrategyKeys.java 策略常量
二、代码笔记
1. 重试策略接口
统一规范,所有重试策略都必须实现 doRetry 方法。
▼java复制代码public interface RetryStrategy { RpcResponse doRetry(Callable<RpcResponse> callable) throws Exception; }
2. 不重试策略
直接执行一次,失败立即抛出异常。
▼java复制代码public class NoRetryStrategy implements RetryStrategy { @Override public RpcResponse doRetry(Callable<RpcResponse> callable) throws Exception { return callable.call(); } }
3. 固定间隔重试策略
基于 Guava Retrying 实现,功能强大。
重试规则:
- 出现 Exception 就重试
- 每次间隔 3秒
- 最多 3次尝试(1次正常+2次重试)
- 每次重试打印日志
▼java复制代码public class FixedIntervalRetryStrategy implements RetryStrategy { @Override public RpcResponse doRetry(Callable<RpcResponse> callable) throws Exception { Retryer<RpcResponse> retryer = RetryerBuilder.<RpcResponse>newBuilder() .retryIfExceptionOfType(Exception.class) // 异常重试 .withWaitStrategy(WaitStrategies.fixedWait(3, TimeUnit.SECONDS)) // 等待3秒 .withStopStrategy(StopStrategies.stopAfterAttempt(3)) // 最多试3次 .withRetryListener(attempt -> { log.info("重试次数 {}", attempt.getAttemptNumber()); }) .build(); return retryer.call(callable); } }
4. 重试策略工厂 + SPI
支持 SPI 动态加载,可无缝扩展更多重试策略。
▼java复制代码public class RetryStrategyFactory { static { SpiLoader.load(RetryStrategy.class); } private static final RetryStrategy DEFAULT = new NoRetryStrategy(); public static RetryStrategy getRetryStrategy(String key) { return SpiLoader.getInstance(RetryStrategy.class, key); } }
5. 策略常量
▼java复制代码public interface RetryStrategyKeys { String NO = "no"; // 不重试 String FIXED_INTERVAL = "fixedInterval"; // 固定间隔 }
三、使用方式(代理层调用)
▼java复制代码RetryStrategy retryStrategy = RetryStrategyFactory.getRetryStrategy("fixedInterval"); RpcResponse response = retryStrategy.doRetry(() -> VertxTcpClient.doRequest(rpcRequest, serviceMetaInfo) );
四、重试策略对比
| 策略 | 行为 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| no(不重试) | 一次失败立即抛错 | 最快、无延迟 | 不稳定 | 实时性高、非幂等接口 |
| fixedInterval(固定间隔) | 失败等3秒再试,最多3次 | 提高成功率、稳定 | 增加调用耗时 | 网络波动、幂等接口 |
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
学习Python的第三天
3
今天的学习1.cas 是什么?2.cas会有什么问题?3.并发工具类CountDownlatch 是干什么的?4.原子操作类都有什么?5.什么是RAG?6.RAG的工作流程是什么?7.文档切割策略都有哪些?8.@Autowired 和@Resource 注解的区别?9.Spring 中的设计模式有哪些?10.什么是 IOC?唉,我也不知道学这些还有没有用,是不是有点过时
3
Day 10✅ 今天做了:1、6007作业:动态规划、标签修正法;5489作业2、马里奥训练效果更差了,先保留学习率衰减函数,其它参数变回之前的样子3、确定6007小组项目选题,配置环境⏰ 明天计划:1、6007复习2、完整运行6007项目参考代码3、了解funsearch
2
day2✅️:今天把MySQL基础篇完结了,进阶要先了解Linux和虚拟机才能进行下去,虚拟机之前弄好了。我的项目进度7%了。⏰️:明天学SpringBoot3还有Java📚:今天还误打误撞找到了梯子,但是免费的能用的太少了,花钱买的又很贵,我只是想用codex,到底怎么样才能访问啊数据库这玩意也太底层太抽象了吧,感觉是最难理解的技术,明天我一定找到一个能用的梯子
2
一.今天学了学到了web后端的实战部分正在熟悉怎么写接口二.明天目标2道hot100三.今日感悟不要一边做一边怀疑,走弯路总比原地踏步强。
1
