偶然看到的,面试也没被问到过,所以这里只是做了解,并不会太详细
重试的介绍
Spring Retry是一个重试框架。
无论是单体项目还是分布式项目,尤其是分布式项目中,系统的调用是有一个不确定性和不稳定性的,比如说网络波动、服务间的通信延迟、暂时性的系统故障
等等,都可能会导致我们系统操作失败。但是这些故障往往可能都是暂时性的,可以通过简单的重试就可以成功。
比如说在分布式系统中进行远程调用,系统A调用系统B(5台服务器的集群),系统在调用的时候是随机去调用系统B的其中一台服务器,但是系统B可能会因为网络问题,或者说系统B本身就有问题,这导致系统A调用B,是有可能会不成功的。
如果说这个时候调用不成功直接返回失败,那显然是有问题的。如果此时重试
一下,那么就有可能重试成功了。
为什么需要重试框架?
在分布式系统和微服务架构中,服务间频繁进行网络通信。这些系统经常会因为多种原因暂时无法响应请求。在这样的场景下,重试机制
显得尤为重要,因为它可以:
- 提高系统的容错能力:通过自动重试失败的操作,系统可以更好地处理临时的网络问题或服务不稳定性。
- 提升用户体验:在后端自动处理故障,无需用户干预重新发起请求。
- 优化资源利用:防止因暂时性故障而浪费资源,如重新初始化连接或重新加载数据。
试框架的关键特性
理想的重试框架应该具备以下特性:
- 灵活的重试策略:能够定义重试次数、重试间隔,以及何种情况下触发重试。
- 易于集成和使用:无缝集成到现有应用程序,简化重试逻辑的实现。
- 支持多种回退策略:在重试最终失败后,能够执行自定义的回退操作,如记录日志、发送警报或者调用替代方案。
重试框架优缺点对比
在Java生态系统中,有几种流行的重试框架,每个都有其独特的特点和优势。我们将重点关注三个广泛使用的框架:Spring Retry、Resilience4j和Failsafe。
- Spring Retry:与Spring生态的完美融合
Spring Retry 是 Spring 生态系统的一部分,为需要重试逻辑的操作提供了简单而强大的解决方案。它与Spring 框架的其他部分(如Spring Boot 和Spring Cloud)紧密集成,使得在这些环境中实现重试机制变得轻而易举。
- 优点:与Spring框架无缝集成;支持声明式重试;易于配置和使用。
- 缺点:依赖干Spring环境;相对于其他框架,功能可能较为有限。
- Resilience4j:面向微服务的故障处理
Resilience4j 是为Java 8和函数式编程设计
的轻量级故障处理库,它不仅提供了重试机制,还包括断路器、限流、熔断等功能。这使得Resilience4j 成为构建复杂微服务架构的理想选择。
- 优点:提供全面的故障处理策略;基于函数式编程,易于集成和使用。
- 缺点:学习曲线相对较陡;配置较为复杂。
- Failsafe:简单灵活的错误处理
Failsafe是一个轻量级的故障处理库,其设计理念是简单性和灵活性。虽然功能比Resilience4j简单,但它在易用性和直观性方面具有明显优势。
- 优点:简单直观的API设计;同时支持同步和异步编程。
- 缺点:提供的故障处理机制相对基础。
Spring Retry的使用
- maxAttempts 最大重试次数
- backoff 重试间隔
在 Spring Retry 中,@Recover注解主要用于定义当重试达到最大次数后仍失败时的恢复方法。
以下是其具体作用:
一、定义恢复逻辑
当被重试的方法多次执行仍失败后,Spring Retry 框架会尝试调用带有@Recover注解的方法。这个方法可以用来处理失败的情况,进行一些补救操作,比如记录错误日志、发送通知、进行数据清理或者采取其他替代方案以尽量减少故障带来的影响。
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
public class MyService {
@Retryable(value = Exception.class, maxAttempts = 3)
public void myMethod() throws Exception {
// 可能会失败的业务逻辑
throw new Exception("模拟业务方法失败");
}
@Recover
public void recoverMethod(Exception e) {
// 当重试 3 次后仍失败,执行此恢复方法
System.out.println("业务方法执行失败,进入恢复方法。错误信息:" + e.getMessage());
}
}
在上述代码中,如果myMethod方法执行失败,Spring Retry 会尝试最多重试 3 次,若 3 次都失败,则会调用recoverMethod方法进行恢复处理。
二、参数匹配
带有@Recover注解的方法的参数列表应该与被重试方法抛出的异常相匹配,或者是其超类。这样,Spring Retry 框架才能正确地将失败时抛出的异常传递给恢复方法进行处理。
总的来说,@Recover注解为在使用 Spring Retry 进行重试操作时提供了一种在重试失败后的应对机制,增强了系统的健壮性和容错性。
引用自:
https://www.bilibili.com/video/BV1Za4y1679a/?spm_id_from=333.337.search-card.all.click&vd_source=64c73c596c59837e620fed47fa27ada7
榜样的力量是无穷的。三五年间,白鹿原上的平原和白鹿原下的河川已经成为罂粟的王国。
白鹿原
陈忠实