Spring Retry

发布于:2024-11-02 ⋅ 阅读:(108) ⋅ 点赞:(0)

偶然看到的,面试也没被问到过,所以这里只是做了解,并不会太详细

重试的介绍

Spring Retry是一个重试框架。

无论是单体项目还是分布式项目,尤其是分布式项目中,系统的调用是有一个不确定性和不稳定性的,比如说网络波动、服务间的通信延迟、暂时性的系统故障等等,都可能会导致我们系统操作失败。但是这些故障往往可能都是暂时性的,可以通过简单的重试就可以成功。

比如说在分布式系统中进行远程调用,系统A调用系统B(5台服务器的集群),系统在调用的时候是随机去调用系统B的其中一台服务器,但是系统B可能会因为网络问题,或者说系统B本身就有问题,这导致系统A调用B,是有可能会不成功的。

如果说这个时候调用不成功直接返回失败,那显然是有问题的。如果此时重试一下,那么就有可能重试成功了。

为什么需要重试框架?

在分布式系统和微服务架构中,服务间频繁进行网络通信。这些系统经常会因为多种原因暂时无法响应请求。在这样的场景下,重试机制
显得尤为重要,因为它可以:

  • 提高系统的容错能力:通过自动重试失败的操作,系统可以更好地处理临时的网络问题或服务不稳定性。
  • 提升用户体验:在后端自动处理故障,无需用户干预重新发起请求。
  • 优化资源利用:防止因暂时性故障而浪费资源,如重新初始化连接或重新加载数据。

试框架的关键特性

理想的重试框架应该具备以下特性:

  • 灵活的重试策略:能够定义重试次数、重试间隔,以及何种情况下触发重试。
  • 易于集成和使用:无缝集成到现有应用程序,简化重试逻辑的实现。
  • 支持多种回退策略:在重试最终失败后,能够执行自定义的回退操作,如记录日志、发送警报或者调用替代方案。

重试框架优缺点对比

在Java生态系统中,有几种流行的重试框架,每个都有其独特的特点和优势。我们将重点关注三个广泛使用的框架:Spring Retry、Resilience4j和Failsafe。

  1. Spring Retry:与Spring生态的完美融合

Spring Retry 是 Spring 生态系统的一部分,为需要重试逻辑的操作提供了简单而强大的解决方案。它与Spring 框架的其他部分(如Spring Boot 和Spring Cloud)紧密集成,使得在这些环境中实现重试机制变得轻而易举。

  • 优点:与Spring框架无缝集成;支持声明式重试;易于配置和使用。
  • 缺点:依赖干Spring环境;相对于其他框架,功能可能较为有限。
  1. Resilience4j:面向微服务的故障处理

Resilience4j 是为Java 8和函数式编程设计的轻量级故障处理库,它不仅提供了重试机制,还包括断路器、限流、熔断等功能。这使得Resilience4j 成为构建复杂微服务架构的理想选择。

  • 优点:提供全面的故障处理策略;基于函数式编程,易于集成和使用。
  • 缺点:学习曲线相对较陡;配置较为复杂。
  1. 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

榜样的力量是无穷的。三五年间,白鹿原上的平原和白鹿原下的河川已经成为罂粟的王国。

白鹿原
陈忠实


网站公告

今日签到

点亮在社区的每一天
去签到