SpringRetry策略设计
SpringRetry策略设计
一、 BackOff策略
整体的关系图:
image.png
ExponentialBackOffPolicy指数退避策略
顾名思义,该BackOff策略能实现指数级的线程睡眠行为,它需要实现SleepingBackOffPolicy接口,持有ThreadWaitSleeper对象,其类继承关系如下:
image.png
打开源码注意其实现的start方法
image.png
它持有的是BackOffContext,在该上下文对象中定义了同步方法计算下一次睡眠时间,当RetryTemplate的doExcute方法调用核心方法backOff方法时候进行计算结果时长的线程睡眠;
FixedBackOffPolicy固定时间退避策略
其父类StatelessBackOffPolicy 为一个抽象类,并且实现了实现SleepingBackOffPolicy接口,继承关系如图
image.png
从源码可以看出其是一个固定时间的退避策略,默认为1秒钟的延迟;
二、 Retry策略
整体的关系图:
单重试策略按最大重试次数设置进行重试,实现RetryPolicy接口,本身比较简单,注意其上下文对象SimpleRetryContext继承关系,实现的是RetryContext接口,如图
image.png
由于比较策略简单,基本没有其他复杂的定义,直接赋使用父类中的上下文对象定义;
CircuitBreakerRetryPolicy熔断重试策略
相比简单重试策略,熔断概念就涉及熔断窗口时间、熔断超时时间以及熔断本身的重试策略,很明显它的结构会比简单重试策略复杂,我们看下它的上下文定义对象CircuitBreakerRetryContext
image.png
这些不同场景的策略定义主要由这些不同复杂程度的重试上下文信息体现,最终交给模板类去执行,完成重试;
三、 扩展阅读
Spring-cloud-Netflix-ribbon中RibbonRetryPolicy实现也是Retry接口,类继承关系:
image.png
可见SpringRetry的整个设计和Spring是一脉相承的,对于重试一块的设计,思想是想通的;