SpringRetry源码解读

SpringRetry策略设计

2019-11-08  本文已影响0人  梦想又照进现实

SpringRetry策略设计

一、 BackOff策略
整体的关系图:


image.png

ExponentialBackOffPolicy指数退避策略
顾名思义,该BackOff策略能实现指数级的线程睡眠行为,它需要实现SleepingBackOffPolicy接口,持有ThreadWaitSleeper对象,其类继承关系如下:


image.png

打开源码注意其实现的start方法


image.png

它持有的是BackOffContext,在该上下文对象中定义了同步方法计算下一次睡眠时间,当RetryTemplate的doExcute方法调用核心方法backOff方法时候进行计算结果时长的线程睡眠;

FixedBackOffPolicy固定时间退避策略
其父类StatelessBackOffPolicy 为一个抽象类,并且实现了实现SleepingBackOffPolicy接口,继承关系如图


image.png

从源码可以看出其是一个固定时间的退避策略,默认为1秒钟的延迟;

二、 Retry策略
整体的关系图:

image.png

单重试策略按最大重试次数设置进行重试,实现RetryPolicy接口,本身比较简单,注意其上下文对象SimpleRetryContext继承关系,实现的是RetryContext接口,如图


image.png

由于比较策略简单,基本没有其他复杂的定义,直接赋使用父类中的上下文对象定义;

CircuitBreakerRetryPolicy熔断重试策略
相比简单重试策略,熔断概念就涉及熔断窗口时间、熔断超时时间以及熔断本身的重试策略,很明显它的结构会比简单重试策略复杂,我们看下它的上下文定义对象CircuitBreakerRetryContext


image.png

这些不同场景的策略定义主要由这些不同复杂程度的重试上下文信息体现,最终交给模板类去执行,完成重试;

三、 扩展阅读
Spring-cloud-Netflix-ribbon中RibbonRetryPolicy实现也是Retry接口,类继承关系:


image.png

可见SpringRetry的整个设计和Spring是一脉相承的,对于重试一块的设计,思想是想通的;

上一篇 下一篇

猜你喜欢

热点阅读