本文概览:介绍了两种重试机制:自定义和spring的@Retryable。

1 重试的引入

在调用外部服务进行查询时,常常因为网络抖动、服务方进行限流等因素造成查询失败。为了克服这些问题,引入了重试机制。

2 自定义重试的实现

如下在查询时,可以通过重试策略,在服务方导致查询失败时进行重试,而不是立刻返回失败异常。

3 基于@Retryable的实现

1、pom.xml

spring版本选择3.2.3.RELEASE。

2、spring配置文件

3、代码

关于上面@Retryable的说明:

  • maxAttempts,尝试次数
  • backoff,可以指定暂停时间
  • value和inclue一样,当出现这些异常时,进行重试。

4、测试

执行结果为

23:42:57.450 [main] INFO service.ExecuteWithRetry – execute query,time=1506354177450

23:42:58.455 [main] INFO service.ExecuteWithRetry – execute query,time=1506354178455

23:42:59.459 [main] INFO service.ExecuteWithRetry – execute query,time=1506354179459

java.lang.RuntimeException: error

at service.ExecuteWithRetry.query(ExecuteWithRetry.java:32)

4 相关属性

1、关于backoff中的maxDelay属性

如下一个配置

在上面配置中,我们期望第一次间隔40s执行,第二次40s,第三次80s,等待时间程指数增长。但是发现第一次间隔时间是20s,然后剩下两次都是30秒,原因是这里有个maxdelay属性,默认是30s。时间间隔是取{delay,maxDelay}的最小值。所以上面maxDelay设置为80s(或者大于80s)就可以了,应该设置为:

5 重试原则

1、查询可以进行重试

2、写操作要慎重,除非业务方支持重入

6 相关问题

1 内嵌函数不生效

7 SpringBoot使用retryable

1、maven配置

2、在application添加@EnableRetry

3、在相应函数上添加@Retryable。

(全文完)

分类&标签

发表评论

电子邮件地址不会被公开。 必填项已用*标注