偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SpringBoot高并發(fā)!業(yè)務(wù)方法重試就該使用它

開發(fā) 前端
Fast-Retry是一個高性能任務(wù)重試框架,支持百萬級別任務(wù)的并發(fā)重試處理。與主流的Spring-Retry, Guava-Retry等同步重試框架不同,F(xiàn)ast-Retry是一個支持異步重試框架,支持異步任務(wù)的重試、超時等待、回調(diào)。

環(huán)境:SpringBoot3.2.5

1. 簡介

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

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

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

測試條件

  • 測試線程池: 8個固定線程
  • 單個任務(wù)邏輯: 輪詢5次,隔2秒重試一次,總耗時10秒
  • 未測預(yù)計公式:當(dāng)我們使用線程池的時候, 一般線程池中 總?cè)蝿?wù)處理耗時 = 任務(wù)數(shù)/并發(fā)度 x 單個任務(wù)重試耗時

圖片圖片

2. 實戰(zhàn)案例

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

運行結(jié)果

成功

執(zhí)行業(yè)務(wù)方法, 隨機值: 5
執(zhí)行業(yè)務(wù)方法, 隨機值: 4
執(zhí)行業(yè)務(wù)方法, 隨機值: 1
結(jié)果: success

失敗

圖片圖片

超過重試次數(shù)后拋出異常,并且方法執(zhí)行的最終結(jié)果返回: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("執(zhí)行業(yè)務(wù)方法, 隨機值: %d%n", r) ;
  if (r != 1) {
    throw new RuntimeException("錯誤的參數(shù): " + r) ;
  }
  return "success" ;
}

自定義方法返回結(jié)果重試策略。

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

結(jié)果重試策略可以有多個。

2.4 異步任務(wù)重試

@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 執(zhí)行業(yè)務(wù)方法...") ;
    int r = new Random().nextInt(10) ;
    if (r != 1) {
      // throw new RuntimeException("錯誤的參數(shù): " + r) ;
      return "1" ;
    }
    return "success" ;
  }) ;
}

輸出結(jié)果

async 執(zhí)行業(yè)務(wù)方法...
async 執(zhí)行業(yè)務(wù)方法...
async 執(zhí)行業(yè)務(wù)方法...
發(fā)生錯誤: 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) {
  // 方法體與上面基本,一樣只不過其中拋出的是異常
}

輸出結(jié)果

async 執(zhí)行業(yè)務(wù)方法...
發(fā)生錯誤: java.lang.RuntimeException: 錯誤的參數(shù): 3

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

在spring-retry中你可以在注解中配置recover,指定一個恢復(fù)的方法(或降級的方法),在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) {}

當(dāng)重試次數(shù)用盡后,將調(diào)用我們這里配置的businessRecover方法,同時在該方法中還可以獲取具體的異常信息。

責(zé)任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2023-09-25 08:06:44

工具非阻塞式接口

2024-01-04 18:01:55

高并發(fā)SpringBoot

2021-03-11 08:00:00

存儲數(shù)據(jù)SSD

2021-12-27 07:59:11

Web3區(qū)塊鏈協(xié)議

2025-01-20 00:00:03

高并發(fā)秒殺業(yè)務(wù)

2021-03-12 18:25:09

開發(fā)前端React

2024-09-10 10:42:27

2018-10-23 10:28:01

服務(wù)器流量高并發(fā)

2018-09-11 08:37:05

高并發(fā)服務(wù)器優(yōu)化

2023-10-23 11:40:44

SpringBootDisruptor

2022-11-21 06:40:23

微服務(wù)架構(gòu)

2019-06-28 10:55:04

預(yù)熱高并發(fā)并發(fā)高

2020-10-28 07:10:07

Nginx高可用高并發(fā)

2017-11-13 11:07:32

Nginx搭建高可用

2025-02-03 08:16:56

2019-04-16 15:40:48

Java架構(gòu)高并發(fā)

2020-04-10 10:10:28

Nginx高并發(fā)性能

2024-01-05 18:01:17

高并發(fā)策略程序

2022-03-01 16:58:25

業(yè)務(wù)預(yù)測模型

2012-02-06 09:59:16

蘋果iPhone微軟
點贊
收藏

51CTO技術(shù)棧公眾號