Java 分布式高并发重试方案及实现

news/2025/3/18 17:05:14/

文章目录

  • Java 分布式高并发重试方案及实现
    • 一、重试机制的背景和意义
    • 二、基于 Spring Boot 的重试方案实现
      • 1. 使用 Spring Retry 实现重试机制
        • 添加依赖
        • 开启重试功能
        • 定义重试逻辑
        • 使用重试服务
      • 2. 使用 Fast-Retry 实现高性能重试
        • 引入依赖
        • 编程式重试
        • 注解式重试
    • 三、重试机制的注意事项
    • 四、总结

Java 分布式高并发重试方案及实现

分布式系统中,高并发场景下接口调用的稳定性至关重要。为了应对接口调用失败的情况,提高系统的容错性和可靠性,重试机制成为一种常见的解决方案。本文将介绍 Java 分布式高并发重试方案,并基于 Spring Boot 提供具体的实现方法。

一、重试机制的背景和意义

分布式系统中,服务之间的调用可能会因为网络波动、超时、服务繁忙等原因导致失败。如果不对这些失败的调用进行处理,可能会导致业务流程中断,影响用户体验。通过对接口调用进行重试,可以在一定程度上提高调用的成功率,保证业务的连续性。

二、基于 Spring Boot 的重试方案实现

1. 使用 Spring Retry 实现重试机制

Spring Retry 是 Spring 提供的一个用于实现重试功能的库,支持多种重试策略和回退机制。

添加依赖

在项目的 pom.xml 文件中,添加 Spring Retry 的依赖:

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.1</version>
</dependency>
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry-annotations</artifactId><version>1.3.1</version>
</dependency>
开启重试功能

在 Spring Boot 应用的主类或配置类中添加 @EnableRetry 注解:

java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.retry.annotation.EnableRetry;@SpringBootApplication
@EnableRetry
public class RetryApplication {public static void main(String[] args) {SpringApplication.run(RetryApplication.class, args);}
}
定义重试逻辑

创建一个服务类,并在需要重试的方法上添加 @Retryable 注解:

java">import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;@Service
public class RetryService {@Retryable(value = { RuntimeException.class }, maxAttempts = 3, backoff = @Backoff(delay = 2000))public void performOperation() {System.out.println("Performing operation...");if (Math.random() > 0.5) {throw new RuntimeException("Operation failed");}System.out.println("Operation succeeded");}@Recoverpublic void recover(RuntimeException e) {System.out.println("Operation failed after retries: " + e.getMessage());}
}

在上述代码中,@Retryable 注解标记了 performOperation 方法,指定了当发生 RuntimeException 异常时进行重试。maxAttempts 指定最大重试次数,backoff 指定了重试间隔的初始延迟。

使用重试服务

在控制器中调用重试服务的方法:

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RetryController {@Autowiredprivate RetryService retryService;@GetMapping("/retry")public String retryOperation() {retryService.performOperation();return "Operation attempted";}
}

2. 使用 Fast-Retry 实现高性能重试

Fast-Retry 是一个高性能的百万级任务重试框架,适用于分布式高并发场景。

引入依赖

在项目的 pom.xml 文件中,添加 Fast-Retry 的依赖:

<dependency><groupId>io.github.burukeyou</groupId><artifactId>fast-retry-all</artifactId><version>0.2.0</version>
</dependency>
编程式重试

使用重试队列实现重试逻辑:

java">import io.github.burukeyou.fastretry.annotation.EnableFastRetry;
import io.github.burukeyou.fastretry.core.RetryQueue;
import io.github.burukeyou.fastretry.task.RetryTask;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;@RestController
@EnableFastRetry
public class FastRetryController {@GetMapping("/fastRetry")public String fastRetry() {ExecutorService executorService = Executors.newFixedThreadPool(8);RetryQueue queue = new FastRetryQueue(executorService);RetryTask<String> task = new RetryTask<String>() {int result = 0;@Overridepublic long waitRetryTime() {return 2000;}@Overridepublic boolean retry() {return ++result < 5;}@Overridepublic String getResult() {return result + "";}};CompletableFuture<String> future = queue.submit(task);try {log.info("任务结束 结果:{}", future.get());} catch (Exception e) {e.printStackTrace();}return "Task submitted";}
}
注解式重试

使用注解 @FastRetry 实现重试逻辑:

java">import io.github.burukeyou.fastretry.annotation.EnableFastRetry;
import io.github.burukeyou.fastretry.annotation.FastRetry;
import io.github.burukeyou.fastretry.annotation.RetryWait;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.CompletableFuture;@RestController
@EnableFastRetry
public class AnnotationRetryController {@GetMapping("/annotationRetry")@FastRetry(retryWait = @RetryWait(delay = 2))public CompletableFuture<String> annotationRetry() {return CompletableFuture.completedFuture("success");}
}

三、重试机制的注意事项

在实现重试机制时,需要注意以下几点:

  1. 避免无限重试:设置合理的重试次数,避免因无限重试导致系统资源耗尽。
  2. 控制重试间隔:设置适当的重试间隔,避免对服务造成过大压力。
  3. 考虑幂等性:对于非幂等性的接口,需要谨慎处理重试逻辑,避免因重复调用导致数据不一致。
  4. 记录日志和监控:对接口重试的情况进行记录和监控,方便排查问题和分析系统性能。

四、总结

分布式高并发场景中,重试机制是提高系统容错性和可靠性的重要手段。本文介绍了基于 Spring Boot 的两种重试方案:使用 Spring Retry 和 Fast-Retry。通过合理的配置和使用,可以有效地提高接口调用的成功率,保证系统的稳定运行。在实际应用中,需要根据业务需求和系统特性选择合适的重试策略,并注意重试机制的潜在问题,以实现高效、可靠的重试功能。


http://www.ppmy.cn/news/1580114.html

相关文章

C# 一文读懂委托与事件

什么是委托 delegate 诞生&#xff1a;技术点出来的原因就是 有一些需要将方法作为入参 处理的情况 比如 业务处理完需要回调函数 那就需要传函数入参 委托是C#中的一种类型安全函数指针&#xff0c;允许将方法作为参数传递或存储。它本质上是面向对象的&#xff0c;对方法签名…

Vue:添加响应式数据

Vue&#xff1a;添加响应式数据 1. 什么是响应式&#xff1f; 修改 data 后&#xff0c;页面自动改变/刷新&#xff0c;这就是响应式。就像我们在使用 Excel 的时候&#xff0c;修改一个单元格中的数据&#xff0c;其它单元格的数据会联动更新&#xff0c;这也是响应式。在前…

基于FPGA轨道交通6U机箱CPCI脉冲板板卡

板卡简介&#xff1a; 本板为脉冲板&#xff0c;脉冲板主要执行CPU下达的指令&#xff0c;通过实现各种控制算法来调节PWM&#xff0c;然后输出光纤PWM信号来驱动变频器功率模块以达到控制电机的目的。 性能规格&#xff1a; 电源&#xff1a;DC5V&#xff1b;15V FPGA&…

主流区块链平台对 EVM 的依赖情况分类说明

文章目录 概要1. EVM 兼容链Binance Smart Chain (BSC)Polygon (PoS 链)Avalanche C-ChainFantomOptimism/Arbitrum 2. 非 EVM 链3. 混合型链AvalanchePolygon SupernetsBNB Chain 概要 1. EVM 兼容链 这些链直接支持以太坊虚拟机&#xff0c;开发者可用 Solidity 编写合约&a…

快速进行数据验证的优雅实现-注解

javax.validation包下的注解主要用于数据验证&#xff0c;确保数据符合特定的约束条件。以下是一个详细的表格&#xff0c;列出了这些注解的名称、作用、使用场景和示例&#xff1a; Excel 表格示例 注解名称作用使用场景示例AssertFalse确保字段值为 false布尔字段的验证Ass…

工程化与框架系列(32)--前端测试实践指南

前端测试实践指南 &#x1f9ea; 引言 前端测试是保证应用质量的重要环节。本文将深入探讨前端测试的各个方面&#xff0c;包括单元测试、集成测试、端到端测试等&#xff0c;并提供实用的测试工具和最佳实践。 测试概述 前端测试主要包括以下类型&#xff1a; 单元测试&a…

P11229 [CSP-J 2024] 小木棍

题目传送门 前言 我们班很多人这道题都爆了&#xff0c;原因是写分讨写挂了。不像睿智的我&#xff0c;直接暴力加上一点点思维。 解题思路 step 1 首先我们把每个数的贡献都列出来。 设 g ( x ) g(x) g(x) 为拼成 x x x 需要的木棍数量。 第一行表示数 x i x_i xi​…

正则表达式小结

正则表达式是一种用于描述文本模式的特殊字符串&#xff0c;它由一系列字符和特殊字符组成&#xff0c;用于匹配和操作文本数据。下面是正则表达式的一些常见规则&#xff1a; 字符匹配&#xff1a; 普通字符&#xff1a;正则表达式中的普通字符&#xff08;字母、数字、符号&a…