重试也能有框架简直了

129 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

前言

  • 你在开发中应该遇到过网络问题导致本次操作失败吧,有可能你依赖别人的服务,那个阶段别人服务可能正在重启。这种场景下你也不能要求别人服务万年不重启,spring要么说很强大呢?平时我们无非就是在业务代码中自己手动进行重试操作。而Spring为我们提供了重试框架

  • Spring Retry 为 Spring 应用程序提供了声明性重试支持。它用于Spring批处理、Spring集成、Apache Hadoop(等等)。它主要是针对可能抛出异常的一些调用操作,进行有策略的重试

  • 准备一个任务方法,我这里是采用一个随机整数,根据不同的条件返回不同的值,或者抛出异常

重试策略

  • NeverRetryPolicy:  只允许调用RetryCallback一次,不允许重试
  • AlwaysRetryPolicy:  允许无限重试,直到成功,此方式逻辑不当会导致死循环
  • SimpleRetryPolicy:  固定次数重试策略,默认重试最大次数为3次,RetryTemplate默认使用的策略
  • TimeoutRetryPolicy:  超时时间重试策略,默认超时时间为1秒,在指定的超时时间内允许重试
  • ExceptionClassifierRetryPolicy:  设置不同异常的重试策略,类似组合重试策略,区别在于这里只区分不同异常的重试
  • CircuitBreakerRetryPolicy:  有熔断功能的重试策略,需设置3个参数openTimeoutresetTimeoutdelegate
  • CompositeRetryPolicy:  组合重试策略,有两种组合方式,乐观组合重试策略是指只要有一个策略允许即可以重试,悲观组合重试策略是指只要有一个策略不允许即可以重试,但不管哪种组合方式,组合中的每一个策略都会执行

重试回退策略

重试回退策略,指的是每次重试是立即重试还是等待一段时间后重试。

默认情况下是立即重试,如果需要配置等待一段时间后重试则需要指定回退策略BackoffRetryPolicy

  • NoBackOffPolicy:  无退避算法策略,每次重试时立即重试
  • FixedBackOffPolicy:  固定时间的退避策略,需设置参数sleeperbackOffPeriodsleeper指定等待策略,默认是Thread.sleep,即线程休眠,backOffPeriod指定休眠时间,默认1秒
  • UniformRandomBackOffPolicy:  随机时间退避策略,需设置sleeperminBackOffPeriodmaxBackOffPeriod,该策略在minBackOffPeriod,maxBackOffPeriod之间取一个随机休眠时间,minBackOffPeriod默认500毫秒,maxBackOffPeriod默认1500毫秒
  • ExponentialBackOffPolicy:  指数退避策略,需设置参数sleeperinitialIntervalmaxIntervalmultiplier,initialInterval指定初始休眠时间,默认100毫秒,maxInterval指定最大休眠时间,默认30秒,multiplier指定乘数,即下一次休眠时间为当前休眠时间*multiplier
  • ExponentialRandomBackOffPolicy:  随机指数退避策略,引入随机乘数可以实现随机乘数回退

我们可以根据自己的应用场景和需求,使用不同的策略,不过一般使用默认的就足够了