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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
Day 29✅ 今天做了:Redis消息队列⏰ 明天计划:继续学消息队列
2
Day 17🧭行动:学习了Python最后一个知识点:异常处理🤓体会:Python 程序一旦发生异常,如果没有捕获处理,程序就会直接崩溃终止。使用"try-except"捕获异常,可以预先写好异常处理方案:比如打印友好提示、记录日志、释放资源,保证程序不会直接退出,还能继续运行。🧑💻代码:try:print("================================")# pri
2
Day1今天学习了java中if的使用
1
day 61今天来学校上课了,和教授谈了,可以接下RA工作,不过一周只能charge 10h, 工资很少,不过一个月600刀也勉强比没有好。今天的工作还没做完,最近在做知识库构造,Ui/UX上周就设计完,现在在做底座的建设今天也让Claude直接帮我把Neetcode150 题目+解题思路+代码给我整理了,我发现我真的只有找碎片化时间才能做题,我还不如先背先回忆(之前都做过)祝祖国母亲节日快乐,也
2
Day 1✅ 今天做了:⏰ 明天计划:📚 今日感悟:
0
