作者:端木轩
来源:https://www.jianshu.com/p/d56c417d2b97
使用场景
在日常开发中,我们经常会遇到需要调用外部服务和接口的场景。外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取。重试策略在服务治理方面也有很广泛的使用,通过定时检测,来查看服务是否存活(Active)。
Guava Retrying 是一个灵活方便的重试组件,包含了多种的重试策略,而且扩展起来非常容易。
用作者的话来说:
This is a small extension to Google’s Guava library to allow for the creation of configurable retrying strategies for an arbitrary function call, such as something that talks to a remote service with flaky uptime.
使用 Guava-retrying 你可以自定义来执行重试,同时也可以监控每次重试的结果和行为,重要的基于 Guava 风格的重试方式真的很方便。
代码示例
以下会简单列出 guava-retrying 的使用方式:
如果抛出 IOException 则重试,如果返回结果为 null 或者等于 2 则重试,固定等待时长为 300 ms,多尝试 3 次;
出现异常则执行重试,每次任务执行长执行时间限定为 3 s,重试间隔时间初始为 3 s,多重试 1 分钟,随着重试次数的增加每次递增 1 s,每次重试失败,打印日志;
核心执行逻辑
依赖引入
<dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>2.0.0</version></dependency>
默认的guava中也有包含。
主要接口介绍
- Attempt:一次执行任务;
- AttemptTimeLimiter:单次任务执行时间限制(如果单次任务执行超时,则终止执行当前任务);
- BlockStrategies:任务阻塞策略(通俗的讲就是当前任务执行完,下次任务还没开始这段时间做什么……),默认策略为:BlockStrategies.THREAD_SLEEP_STRATEGY 也就是调用 Thread.sleep(sleepTime);
- RetryException:重试异常;
- RetryListener:自定义重试监听器,可以用于异步记录错误日志;
- StopStrategy:停止重试策略,提供三种:
- StopAfterDelayStrategy :设定一个长允许的执行时间;比如设定长执行10s,无论任务执行次数,只要重试的时候超出了长时间,则任务终止,并返回重试异常RetryException;
- NeverStopStrategy :不停止,用于需要一直轮训知道返回期望结果的情况;
- StopAfterAttemptStrategy :设定大重试次数,如果超出大重试次数则停止重试,并返回重试异常;
- WaitStrategy:等待时长策略(控制时间间隔),返回结果为下次执行时长:
- FixedWaitStrategy:固定等待时长策略;
- RandomWaitStrategy:随机等待时长策略(可以提供一个小和大时长,等待时长为其区间随机值)
- IncrementingWaitStrategy:递增等待时长策略(提供一个初始值和步长,等待时间随重试次数增加而增加)
- ExponentialWaitStrategy:指数等待时长策略;
- FibonacciWaitStrategy :Fibonacci 等待时长策略;
- ExceptionWaitStrategy :异常时长等待策略;
- CompositeWaitStrategy :复合时长等待策略;