AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

聊聊接口重試機(jī)制的幾種解決方案

來(lái)源: 責(zé)編: 時(shí)間:2023-11-06 08:53:25 258觀看
導(dǎo)讀1.前言接口請(qǐng)求重試機(jī)制是保證系統(tǒng)穩(wěn)定性和容錯(cuò)能力的重要手段之一。當(dāng)接口請(qǐng)求發(fā)生失敗或暫時(shí)性錯(cuò)誤時(shí),通過(guò)重試機(jī)制可以提高請(qǐng)求的成功率。本文將詳細(xì)介紹接口請(qǐng)求重試機(jī)制的幾種常見(jiàn)方法。2.幾種方法2.1循環(huán)重試它

1.前言

接口請(qǐng)求重試機(jī)制是保證系統(tǒng)穩(wěn)定性和容錯(cuò)能力的重要手段之一。當(dāng)接口請(qǐng)求發(fā)生失敗或暫時(shí)性錯(cuò)誤時(shí),通過(guò)重試機(jī)制可以提高請(qǐng)求的成功率。本文將詳細(xì)介紹接口請(qǐng)求重試機(jī)制的幾種常見(jiàn)方法。Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.幾種方法

圖片Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.1循環(huán)重試

它的基本思路是:Fxm28資訊網(wǎng)——每日最新資訊28at.com

  1. 定義重試次數(shù),如最大重試5次
  2. 發(fā)送請(qǐng)求,如果失敗則進(jìn)入重試邏輯
  3. 在循環(huán)內(nèi)部,記錄當(dāng)前已重試次數(shù),如當(dāng)前已重試2次
  4. 判斷當(dāng)前重試次數(shù)是否達(dá)到最大次數(shù),如果達(dá)到則終止循環(huán),否則進(jìn)行重試
  5. 在循環(huán)內(nèi)部,可以添加定時(shí)重試間隔,也可以使用指數(shù)退避算法
  6. 發(fā)送重試請(qǐng)求,重復(fù)判斷是否成功,直到成功、達(dá)到最大次數(shù)或其他終止條件

Fxm28資訊網(wǎng)——每日最新資訊28at.com

示例Fxm28資訊網(wǎng)——每日最新資訊28at.com

public class Retry {private static final int MAX_RETRIES = 5;public static Response request() throws Exception {  int retries = 0;  while (true) {    try {      // 發(fā)送請(qǐng)求,返回響應(yīng)      Response response = HttpClient.sendRequest();      // 請(qǐng)求成功則返回響應(yīng)      if (response.isSuccess()) {        return response;      }    } catch (Exception e) {      // 請(qǐng)求失敗進(jìn)行重試    }    // 判斷是否超過(guò)最大重試次數(shù)    if (++retries >= MAX_RETRIES) {      throw new Exception("Exceeded max retries");    }    // 增加間隔后重試    int interval = (int) (Math.random() * 1000);    Thread.sleep(interval);  }}public static void main(String[] args) throws Exception {  Response response = request();  // ...}}

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.2 使用Spring Retry庫(kù)

使用 Spring Retry 庫(kù)可以很方便地實(shí)現(xiàn)接口請(qǐng)求的重試機(jī)制。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.2.1 添加 Maven 依賴
<dependency>  <groupId>org.springframework.retry</groupId>  <artifactId>spring-retry</artifactId>  <version>1.3.1</version></dependency>

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.2.2 添加 @EnableRetry 注解啟用重試功能

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.2.3 在需要重試的方法上添加 @Retryable 注解
@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 5000))public User getUser(String id) {// 遠(yuǎn)程調(diào)用接口}

@Retryable 定義了重試規(guī)則:- value - 重試的異常類型- maxAttempts - 最大重試次數(shù)- backoff - 重試等待策略Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.2.4. 還可以自定義 RetryTemplate 進(jìn)行更復(fù)雜的重試控制
RetryTemplate template = new RetryTemplate();template.execute(context -> {// 可在此處自定義重試邏輯 return remoteClient.invoke();});

Spring Retry 為接口請(qǐng)求重試提供了完善和易用的解決方案,可以靈活控制各種重試參數(shù),適用于復(fù)雜系統(tǒng)的容錯(cuò)要求。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.3 并發(fā)框架異步重試

使用并發(fā)框架的異步請(qǐng)求方式可以較簡(jiǎn)單地實(shí)現(xiàn)接口請(qǐng)求的重試機(jī)制。以CompletableFuture為例:Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.3.1 發(fā)送請(qǐng)求使用CompletableFuture封裝:Fxm28資訊網(wǎng)——每日最新資訊28at.com

CompletableFuture<Response> future = CompletableFuture.supplyAsync(() -> {return service.call();});

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.3.2 當(dāng)請(qǐng)求失敗時(shí),使用retryAsync自動(dòng)完成重試:Fxm28資訊網(wǎng)——每日最新資訊28at.com

future = future.exceptionally(e -> {return service.retryAsync();});

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.3.3 可以鏈?zhǔn)秸{(diào)用,自定義重試邏輯:Fxm28資訊網(wǎng)——每日最新資訊28at.com

future.exceptionally(e -> {    // 處理異常}).thenApplyAsync(resp -> {    // 處理響應(yīng)}).retryAsync(retryCount, delay);

主要優(yōu)點(diǎn)是:Fxm28資訊網(wǎng)——每日最新資訊28at.com

  • 線程安全的異步請(qǐng)求
  • 自動(dòng)重試失敗任務(wù)
  • 簡(jiǎn)潔的鏈?zhǔn)骄幊谭绞?/li>
  • 避免阻塞主線程

Fxm28資訊網(wǎng)——每日最新資訊28at.com

使用并發(fā)框架可以便捷地實(shí)現(xiàn)異步重試機(jī)制,提高系統(tǒng)容錯(cuò)性。其他框架如RxJava也有類似的重試機(jī)制。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.4 消息隊(duì)列重試

使用消息隊(duì)列可以實(shí)現(xiàn)接口請(qǐng)求的異步重試機(jī)制。Fxm28資訊網(wǎng)——每日最新資訊28at.com

基本思路是:Fxm28資訊網(wǎng)——每日最新資訊28at.com

  • 接口請(qǐng)求發(fā)送失敗后,將請(qǐng)求信息封裝為消息,發(fā)送到請(qǐng)求重試的隊(duì)列中。
  • 消息消費(fèi)者從隊(duì)列中獲取失敗的請(qǐng)求,根據(jù)策略進(jìn)行重試。
  • 重復(fù)重試直到成功、重試次數(shù)用盡或其他終止條件。
  • 成功后將消息移除隊(duì)列,失敗則保留消息供再次重試。

主要步驟:Fxm28資訊網(wǎng)——每日最新資訊28at.com

  • 創(chuàng)建請(qǐng)求重試隊(duì)列,如“request.retry.queue”
  • 接口請(qǐng)求失敗后,生成重試消息,發(fā)送到隊(duì)列
  • 消費(fèi)者啟動(dòng)線程從隊(duì)列中取消息重試
  • 根據(jù)重試策略進(jìn)行定時(shí)重試或最大重試數(shù)
  • 成功則確認(rèn)消息,失敗則重新入隊(duì)

使用消息隊(duì)列進(jìn)行重試有利于:Fxm28資訊網(wǎng)——每日最新資訊28at.com

  • 異步重試,不阻塞主線程
  • 可靠地完成重試任務(wù)
  • 靈活控制重試策略

Fxm28資訊網(wǎng)——每日最新資訊28at.com

示例Fxm28資訊網(wǎng)——每日最新資訊28at.com

// 1. 創(chuàng)建隊(duì)列Queue retryQueue = new Queue("request.retry.queue");// 2. 請(qǐng)求失敗,發(fā)送重試消息  public void request() {try {  // 調(diào)用接口  httpClient.post(url, payload);} catch (Exception e) {  // 發(fā)送重試消息  Message msg = new Message(url, payload, maxRetries);  retryQueue.send(msg);}}// 3. 消費(fèi)者線程進(jìn)行重試class RetryConsumer implements Runnable {public void run() {  while (true) {    Message msg = retryQueue.take();         for (int i = 0; i < msg.getMaxRetries(); i++) {      try {        // 重試請(qǐng)求        httpClient.post(msg.getUrl(), msg.getPayload());        // 請(qǐng)求成功,結(jié)束循環(huán)        break;      } catch (Exception e) {        // 等待后繼續(xù)重試      }      }         // 重試完成后,確認(rèn)消息    retryQueue.confirm(msg);  }}}

這就是使用消息隊(duì)列實(shí)現(xiàn)接口重試的基本流程,可以根據(jù)需求擴(kuò)展重試策略、異常處理等邏輯。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.5 自定義重試工具類

使用自定義的重試工具類來(lái)實(shí)現(xiàn)接口請(qǐng)求的重試機(jī)制,提高代碼的復(fù)用性和可維護(hù)性。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

重試工具類的實(shí)現(xiàn)思路:Fxm28資訊網(wǎng)——每日最新資訊28at.com

  • 提供重試方法,參數(shù)包括請(qǐng)求函數(shù)、重試策略等
  • 在重試方法內(nèi)部執(zhí)行循環(huán)請(qǐng)求
  • 每次請(qǐng)求失敗時(shí),根據(jù)策略等待一段時(shí)間
  • 記錄當(dāng)前重試次數(shù),與最大次數(shù)比較
  • 請(qǐng)求成功或者達(dá)到最大重試次數(shù)則結(jié)束循環(huán)

Fxm28資訊網(wǎng)——每日最新資訊28at.com

示例:Fxm28資訊網(wǎng)——每日最新資訊28at.com

public class RetryUtil {public static <T> T retry(RetryCallable<T> callable, RetryPolicy policy) {  int retries = 0;  while(true) {    try {      return callable.call();      } catch(Exception e) {      if (retries >= policy.maxRetries) {        throw e;      }      // 等待      policy.delay();      // 重試次數(shù)加1      retries++;    }  }}}// 執(zhí)行請(qǐng)求的函數(shù)接口interface RetryCallable<T> {T call();}// 重試策略class RetryPolicy {int maxRetries;int delay;}// 使用示例RetryUtil.retry(() -> {// 接口請(qǐng)求return httpClient.get(url);}, policy);

這樣可以提高重試相關(guān)邏輯的復(fù)用性,避免寫(xiě)重復(fù)代碼。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.6 使用遞歸結(jié)構(gòu)

使用遞歸結(jié)構(gòu)也可以實(shí)現(xiàn)接口請(qǐng)求的重試機(jī)制。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

基本思路是設(shè)計(jì)一個(gè)遞歸函數(shù),在函數(shù)內(nèi)部發(fā)送請(qǐng)求,如果失敗則繼續(xù)遞歸調(diào)用自身再次重試。Fxm28資訊網(wǎng)——每日最新資訊28at.com

示例:Fxm28資訊網(wǎng)——每日最新資訊28at.com

public class RetryRequest {private static final int MAX_RETRIES = 3; public static Response request(int retries) {     try {    // 發(fā)送請(qǐng)求    Response response = HttpClient.get("http://example.com");    return response;       } catch (Exception e) {         // 處理異常         // 判斷是否需要重試    if (retries < MAX_RETRIES) {      // 增加重試次數(shù)      retries++;      // 延遲1秒鐘      Thread.sleep(1000);      // 遞歸調(diào)用自身進(jìn)行重試      return request(retries);    }         // 重試失敗    throw new RuntimeException("Request failed after " + MAX_RETRIES + " retries!");       }} public static void main(String[] args) {    Response response = request(0);  // 處理響應(yīng)}}

Fxm28資訊網(wǎng)——每日最新資訊28at.com

主要邏輯是通過(guò)遞歸不斷調(diào)用自身來(lái)實(shí)現(xiàn)重試。優(yōu)點(diǎn)是邏輯較簡(jiǎn)單清晰,缺點(diǎn)是遞歸層次過(guò)深時(shí)可能會(huì)導(dǎo)致堆棧溢出。需要合理設(shè)置最大遞歸深度,也可以通過(guò)循環(huán)改寫(xiě)遞歸來(lái)避免深層遞歸。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.7 使用Resilience4j

Resilience4j是一個(gè)很好的Java重試庫(kù),可以用它來(lái)實(shí)現(xiàn)接口請(qǐng)求的重試機(jī)制。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

主要步驟:Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.7.1添加Resilience4j依賴Fxm28資訊網(wǎng)——每日最新資訊28at.com

<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-retry</artifactId></dependency>

2.7.2 定義重試邏輯Fxm28資訊網(wǎng)——每日最新資訊28at.com

RetryConfig config = RetryConfig.custom().maxAttempts(3).waitDuration(Duration.ofMillis(500)).build();Retry retry = Retry.of("backend", config);

2.7.3 使用重試邏輯調(diào)用接口Fxm28資訊網(wǎng)——每日最新資訊28at.com

String result = retry.executeSupplier(() -> {// 發(fā)送請(qǐng)求return backendService.callAPI();});

2.7.4 自定義重試異常predicateFxm28資訊網(wǎng)——每日最新資訊28at.com

RetryConfig config = RetryConfig.custom().retryOnException(e -> isRetryable(e)).build();

Resilience4j提供了線程安全的重試 decorator,可以通過(guò)配置靈活控制重試策略,很好地支持了接口請(qǐng)求重試。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

2.8 使用網(wǎng)絡(luò)工具重試

我們常用的一些網(wǎng)絡(luò)工具來(lái)做重試Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

示例Fxm28資訊網(wǎng)——每日最新資訊28at.com

public class RetryExample {private static final int MAX_RETRIES = 3;public static String request(String url) throws Exception {  int retries = 0;     while (true) {         try {      // 使用HttpClient發(fā)送請(qǐng)求      return HttpClientUtils.get(url);           } catch (Exception e) {      if (retries >= MAX_RETRIES) {        throw e;      }             // 增加重試次數(shù)      retries++;      // 延遲1秒鐘      TimeUnit.SECONDS.sleep(1);    }  }}   public static void main(String[] args) throws Exception {  String result = request("http://example.com/api");  System.out.println(result);}}// 網(wǎng)絡(luò)工具類class HttpClientUtils {public static String get(String url) throws IOException {  // 發(fā)送GET請(qǐng)求并返回結(jié)果}}

Fxm28資訊網(wǎng)——每日最新資訊28at.com

主要通過(guò)循環(huán)和網(wǎng)絡(luò)工具類來(lái)實(shí)現(xiàn)重試邏輯,延時(shí)控制也可以用Random來(lái)實(shí)現(xiàn)指數(shù)退避。這種 utilities + 循環(huán) 的組合可以實(shí)現(xiàn)靈活可復(fù)用的重試機(jī)制。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.注意事項(xiàng)

圖片圖片Fxm28資訊網(wǎng)——每日最新資訊28at.com

接口請(qǐng)求重試時(shí)需要注意以下幾點(diǎn):Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.1 冪等性接口需要是冪等的,多次調(diào)用結(jié)果相同,避免重復(fù)執(zhí)行帶來(lái)副作用。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.2 資源競(jìng)爭(zhēng)重試可能對(duì)服務(wù)端造成更大壓力,需要考慮限流等措施。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.3 超時(shí)設(shè)置合理設(shè)置重試最大次數(shù)和總超時(shí)時(shí)間,避免長(zhǎng)時(shí)間等待。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.4 重試條件明確哪些異常情況下需要重試,不能無(wú)腦重試所有錯(cuò)誤。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.5 數(shù)據(jù)一致性請(qǐng)求成功后要冪等更新?tīng)顟B(tài),避免重復(fù)數(shù)據(jù)。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.6 異步機(jī)制重試過(guò)程不要阻塞主業(yè)務(wù)線程。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.7 退避策略失敗后延遲一段時(shí)間再重試,可選避免集群重試。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.8 日志記錄記錄重試的次數(shù)、錯(cuò)誤原因等信息,方便排查問(wèn)題。Fxm28資訊網(wǎng)——每日最新資訊28at.com

3.9 容錯(cuò)機(jī)制重試失敗后的降級(jí)處理,避免級(jí)聯(lián)失敗。Fxm28資訊網(wǎng)——每日最新資訊28at.com

Fxm28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

接口請(qǐng)求重試機(jī)制對(duì)保證系統(tǒng)高可用非常關(guān)鍵,需要根據(jù)業(yè)務(wù)需求選擇合適的重試策略。常用的組合策略包括帶最大次數(shù)的定時(shí)/指數(shù)退避重試、故障轉(zhuǎn)移重試等。重試機(jī)制需要綜合設(shè)置以達(dá)到容錯(cuò)效果 又避免產(chǎn)生過(guò)大的系統(tǒng)負(fù)載。Fxm28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-17165-0.html聊聊接口重試機(jī)制的幾種解決方案

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 提升應(yīng)用性能:Go中的同步與異步處理

下一篇: 如何釋放React?Hooks的力量

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場(chǎng)的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號(hào)為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號(hào)的橫向折疊屏,而是跟別的廠商一樣采用了較為常見(jiàn)的
  • 一加Ace2 Pro官宣:普及16G內(nèi)存 引領(lǐng)24G

    一加官方今天繼續(xù)為本月發(fā)布的新機(jī)一加Ace2 Pro帶來(lái)預(yù)熱,公布了內(nèi)存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領(lǐng),還有呢?#一加Ace2Pro#,2023 年 8 月,敬請(qǐng)期待。”同時(shí)
  • Redmi Buds 4開(kāi)箱簡(jiǎn)評(píng):才199還有降噪 可以無(wú)腦入

    在上個(gè)月舉辦的Redmi Note11T Pro系列新機(jī)發(fā)布會(huì)上,除了兩款手機(jī)新品之外,Redmi還帶來(lái)了兩款TWS真無(wú)線藍(lán)牙耳機(jī)產(chǎn)品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們?cè)赗edmi Note11T
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開(kāi)始學(xué)習(xí)反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無(wú)法成功對(duì)代碼進(jìn)行反混淆,尤其是使用自定義混淆器對(duì)其進(jìn)行混淆時(shí)。什么是混
  • 一篇聊聊Go錯(cuò)誤封裝機(jī)制

    %w 是用于錯(cuò)誤包裝(Error Wrapping)的格式化動(dòng)詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個(gè)特殊格式化動(dòng)詞,用于將一個(gè)錯(cuò)誤(或其他可打印的值)包裝在一個(gè)新的錯(cuò)誤中。使
  • Flowable工作流引擎的科普與實(shí)踐

    一.引言當(dāng)我們?cè)谌粘9ぷ骱蜆I(yè)務(wù)中需要進(jìn)行各種審批流程時(shí),可能會(huì)面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動(dòng)處理這些審批流程可能會(huì)導(dǎo)致開(kāi)發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這
  • 虛擬鍵盤(pán) API 的妙用

    你是否在遇到過(guò)這樣的問(wèn)題:移動(dòng)設(shè)備上有一個(gè)固定元素,當(dāng)激活虛擬鍵盤(pán)時(shí),該元素被隱藏在了鍵盤(pán)下方?多年來(lái),這一直是 Web 上的默認(rèn)行為,在本文中,我們將探討這個(gè)問(wèn)題、為什么會(huì)發(fā)生
  • 微博大門常打開(kāi),迎接海外畫(huà)師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語(yǔ)了&rdquo;。&ldquo;為什么日本人說(shuō)話我能聽(tīng)懂?&rdquo;&ldquo;中文不像中文,日語(yǔ)不像日語(yǔ),但是我竟然看懂了&rdquo;&hellip;&hell
  • 榮耀Magicbook V 14 2021曙光藍(lán)版本正式開(kāi)售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍(lán)版本正式開(kāi)售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內(nèi)存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤(pán)鍵程、
Top