用途
该技能面向在 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 之外。
- 不要在没有幂等键的情况下重试非幂等写操作,应保护支付与命令类操作。