成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot高并發!業務方法重試就該使用它

開發 前端
Fast-Retry是一個高性能任務重試框架,支持百萬級別任務的并發重試處理。與主流的Spring-Retry, Guava-Retry等同步重試框架不同,Fast-Retry是一個支持異步重試框架,支持異步任務的重試、超時等待、回調。

環境:SpringBoot3.2.5

1. 簡介

業務功能重試機制通常在項目中是非常有必要的,特別是在處理外部系統調用(如HTTP請求、數據庫操作、消息隊列等)時。這些操作可能因網絡波動、服務暫時不可用等原因而失敗。重試機制可以提高系統的健壯性和用戶體驗,通過自動重試可以減少因單次失敗導致的整體業務中斷。本篇文章將介紹一款非常優秀的重試框架Fast-Retry。

Fast-Retry是一個高性能任務重試框架,支持百萬級別任務的并發重試處理。與主流的Spring-Retry, Guava-Retry等同步重試框架不同,Fast-Retry是一個支持異步重試框架,支持異步任務的重試、超時等待、回調。Spring-Retry, Guava-Retry均無法支持大批量任務的重試,因為會占用過多線程資源導致大量任務在等待處理,隨著任務數的增加,系統吞吐量大大降低,性能指數級降低,Fast-Retry的性能是前者的指數倍。

Fast-Retry,Spring-Retry,Guava-Retry性能對比

測試條件

  • 測試線程池: 8個固定線程
  • 單個任務邏輯: 輪詢5次,隔2秒重試一次,總耗時10秒
  • 未測預計公式:當我們使用線程池的時候, 一般線程池中 總任務處理耗時 = 任務數/并發度 x 單個任務重試耗時

圖片圖片

2. 實戰案例

2.1 引入依賴

<dependency>
  <groupId>io.github.burukeyou</groupId>
  <artifactId>fast-retry-all</artifactId>
  <version>0.2.0</version>
</dependency>

配置開啟重試功能

@SpringBootApplication
@EnableFastRetry
public class SpringbootRetryApplication {}

接下來就可以通過@FastRetry注解配置類或方法。

2.2 基于編程重試

public String process() throws Exception {
  // 自定義結果重試策略,如果返回結果不是"success"則進行重試
  RetryResultPolicy<String> resultPolicy = result -> !result.equals("success");
  FastRetryer<String> retryer = FastRetryBuilder.<String>builder()
      // 重試次數
      .attemptMaxTimes(2)
       // 重試間隔
      .waitRetryTime(1, TimeUnit.SECONDS)
      // 發生異常后是否重試
      .retryIfException(true)
      // 什么類型的異常進行重試
      .retryIfExceptionOfType(RuntimeException.class)
      .exceptionRecover(true)
      // 自定義結果重試策略
      .resultPolicy(resultPolicy)
      .build();
  CompletableFuture<String> future = retryer.submit(() -> {
    int r = new Random().nextInt(10) ;
    System.out.printf("執行業務方法, 隨機值: %d%n", r) ;
    if (r != 1) {
      // 拋出異常,也會重試
      // throw new RuntimeException("錯誤的參數: " + r) ;
      return "dead" ;
    }
    return "success" ;
  });
  return future.get();
}

運行結果

成功

執行業務方法, 隨機值: 5
執行業務方法, 隨機值: 4
執行業務方法, 隨機值: 1
結果: success

失敗

圖片圖片

超過重試次數后拋出異常,并且方法執行的最終結果返回:null。

2.3 基于注解

基于注解方式使用起來與spring-retry差不多。一個注解搞定。

@FastRetry(
  retryWait = @RetryWait(delay = 2), 
  exceptionRecover = false, 
  maxAttempts = 2,
  retryStrategy = PackRetryPolicy.class
)
public String business(Long id, String name) {
  int r = new Random().nextInt(10) ;
  System.out.printf("執行業務方法, 隨機值: %d%n", r) ;
  if (r != 1) {
    throw new RuntimeException("錯誤的參數: " + r) ;
  }
  return "success" ;
}

自定義方法返回結果重試策略。

public class PackRetryPolicy implements RetryResultPolicy<String> {
  public boolean canRetry(String t) {
    return !t.equals("success") ;
  }
}

結果重試策略可以有多個。

2.4 異步任務重試

@FastRetry(
  retryWait = @RetryWait(delay = 2), 
  maxAttempts = 2, 
  retryStrategy = PackRetryPolicy.class
)
public CompletableFuture<String> asyncBusiness(Long id, String name) {
  return CompletableFuture.supplyAsync(() -> {
    System.out.println("async 執行業務方法...") ;
    int r = new Random().nextInt(10) ;
    if (r != 1) {
      // throw new RuntimeException("錯誤的參數: " + r) ;
      return "1" ;
    }
    return "success" ;
  }) ;
}

輸出結果

async 執行業務方法...
async 執行業務方法...
async 執行業務方法...
發生錯誤: com.burukeyou.retry.core.exceptions.FastRetryTimeOutException: 
  The maximum retry count has been exceeded after 2 times. Stop retry

同樣的代碼,如果換成spring-retry,如下:

// spring-retry的注解
@Retryable(maxAttempts = 2)
public CompletableFuture<String> asyncBusiness(Long id, String name) {
  // 方法體與上面基本,一樣只不過其中拋出的是異常
}

輸出結果

async 執行業務方法...
發生錯誤: java.lang.RuntimeException: 錯誤的參數: 3

沒有進行重試,說明spring-retry不支持異步任務。

在spring-retry中你可以在注解中配置recover,指定一個恢復的方法(或降級的方法),在fast-retry中沒有這樣的功能。如下spring-retry示例:

@Retryable(maxAttempts = 2, recover = "businessRecover")
public String business(Long id, String name) {}
@Recover
private String businessRecover(Throwable th, Long id, String name) {}

當重試次數用盡后,將調用我們這里配置的businessRecover方法,同時在該方法中還可以獲取具體的異常信息。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2023-09-25 08:06:44

工具非阻塞式接口

2024-01-04 18:01:55

高并發SpringBoot

2021-12-27 07:59:11

Web3區塊鏈協議

2021-03-11 08:00:00

存儲數據SSD

2025-01-20 00:00:03

高并發秒殺業務

2021-03-12 18:25:09

開發前端React

2024-09-10 10:42:27

2018-10-23 10:28:01

服務器流量高并發

2018-09-11 08:37:05

高并發服務器優化

2023-10-23 11:40:44

SpringBootDisruptor

2022-11-21 06:40:23

微服務架構

2019-06-28 10:55:04

預熱高并發并發高

2020-10-28 07:10:07

Nginx高可用高并發

2025-02-03 08:16:56

2017-11-13 11:07:32

Nginx搭建高可用

2024-01-05 18:01:17

高并發策略程序

2019-04-16 15:40:48

Java架構高并發

2020-04-10 10:10:28

Nginx高并發性能

2022-03-01 16:58:25

業務預測模型

2022-07-18 08:39:18

ACL訪問控制機制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产免费一区二区 | 91国内外精品自在线播放 | 国产精品1区 | 日韩精品一区二区三区在线播放 | 精品一区二区三区在线视频 | 国产一区二区三区四区三区四 | 久久精品亚洲精品国产欧美 | 亚洲人的av| 午夜寂寞影院在线观看 | 成人一级片在线观看 | 国产精品1区 | 九九精品在线 | 免费一级毛片 | 国产精品国产三级国产aⅴ无密码 | 中文在线日韩 | 天天操夜夜拍 | 欧美日韩一区在线观看 | 色资源在线观看 | 国产黄色在线观看 | 免费国产视频 | 亚洲乱码一区二区三区在线观看 | 少妇一级淫片aaaaaaaaa | 日韩中字幕| 97国产精品 | 成人国产一区二区三区精品麻豆 | 欧美区在线| 日日碰碰 | 操视频网站| 99精品欧美 | 欧美电影网 | 天天操天天插 | 亚洲理论在线观看电影 | 欧美成人自拍 | 国产在线观看av | 夜夜久久 | 精品视频免费 | 免费久久久 | 久久久久综合 | av片免费| 特黄毛片 | 亚洲人va欧美va人人爽 |