SuperAPI AI 工具集

resilience-retry

编程与开发

查看项目

更新于 10-16 02:22

技能介绍

用途

该技能面向在 Spring Boot 3 / Spring Framework 6 服务中引入重试、退避(backoff)或并发保护的场景。它帮助在 Spring Retry 与 Resilience4j 之间做出选择,并提醒保持依赖与配置显式声明。

主要能力

  • 覆盖重试、退避与并发保护相关实现方式。
  • 提供 Spring Retry 与 Resilience4j 的选择依据:简单命令式重试使用 Spring Retry;当还需要熔断器、限流或隔离(bulkheads)时使用 Resilience4j。
  • 给出配置与使用示例,包括 @Configuration、@EnableRetry、@Service、@Retryable、@Backoff、@Recover。

示例代码:

@Configuration
@EnableRetry
class RetryConfig { }

@Service
class PaymentClient {
    @Retryable(
        retryFor = ConnectException.class,
        maxAttempts = 4,
        backoff = @Backoff(delay = 200, multiplier = 2.0, maxDelay = 2000))
    PaymentResult charge(ChargeRequest request) { ... }

    @Recover
    PaymentResult recover(ConnectException error, ChargeRequest request) { ... }
}

使用方式与关键说明

  • Boot 3 没有 Spring Framework 7 的核心弹性注解,因此需要选择 Spring Retry 或 Resilience4j。
  • Spring Retry 的 maxAttempts 包含初始调用。
  • 当重试需要与熔断器或隔离组合时,Resilience4j 更合适。
  • 两种方式都基于代理:自调用会绕过通知(advice);在只回滚事务内重试方法,不会为每次尝试创建新事务。

适用场景

适用于为 Spring Boot 3 / Spring Framework 6 服务添加重试、退避或并发保护,尤其是需要决定使用 Spring Retry 还是 Resilience4j 的场合。

限制与常见陷阱

  • 不要使用 Framework 7 的 @EnableResilientMethods,Boot 3 需要 Spring Retry 或 Resilience4j。
  • 不要把 maxAttempts 与重试次数混淆,Spring Retry 包含初始调用。
  • 不要给 Resilience4j 添加 @Recover,恢复必须通过 fallback 或调用方处理来建模。
  • 不要重试自调用方法,应通过 Spring 代理调用。
  • 不要在事务内重试并期望获得新事务,应将重试移到事务 bean 之外。
  • 不要在没有幂等键的情况下重试非幂等写操作,应保护支付与命令类操作。