日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

聊聊接口重試機制的幾種解決方案

來源: 責編: 時間:2023-11-06 08:53:25 233觀看
導讀1.前言接口請求重試機制是保證系統穩定性和容錯能力的重要手段之一。當接口請求發生失敗或暫時性錯誤時,通過重試機制可以提高請求的成功率。本文將詳細介紹接口請求重試機制的幾種常見方法。2.幾種方法2.1循環重試它

1.前言

接口請求重試機制是保證系統穩定性和容錯能力的重要手段之一。當接口請求發生失敗或暫時性錯誤時,通過重試機制可以提高請求的成功率。本文將詳細介紹接口請求重試機制的幾種常見方法。C4m28資訊網——每日最新資訊28at.com

2.幾種方法

圖片C4m28資訊網——每日最新資訊28at.com

2.1循環重試

它的基本思路是:C4m28資訊網——每日最新資訊28at.com

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

C4m28資訊網——每日最新資訊28at.com

示例C4m28資訊網——每日最新資訊28at.com

public class Retry {private static final int MAX_RETRIES = 5;public static Response request() throws Exception {  int retries = 0;  while (true) {    try {      // 發送請求,返回響應      Response response = HttpClient.sendRequest();      // 請求成功則返回響應      if (response.isSuccess()) {        return response;      }    } catch (Exception e) {      // 請求失敗進行重試    }    // 判斷是否超過最大重試次數    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();  // ...}}

C4m28資訊網——每日最新資訊28at.com

2.2 使用Spring Retry庫

使用 Spring Retry 庫可以很方便地實現接口請求的重試機制。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

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

C4m28資訊網——每日最新資訊28at.com

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

C4m28資訊網——每日最新資訊28at.com

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

@Retryable 定義了重試規則:- value - 重試的異常類型- maxAttempts - 最大重試次數- backoff - 重試等待策略C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

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

Spring Retry 為接口請求重試提供了完善和易用的解決方案,可以靈活控制各種重試參數,適用于復雜系統的容錯要求。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

2.3 并發框架異步重試

使用并發框架的異步請求方式可以較簡單地實現接口請求的重試機制。以CompletableFuture為例:C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

2.3.1 發送請求使用CompletableFuture封裝:C4m28資訊網——每日最新資訊28at.com

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

C4m28資訊網——每日最新資訊28at.com

2.3.2 當請求失敗時,使用retryAsync自動完成重試:C4m28資訊網——每日最新資訊28at.com

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

C4m28資訊網——每日最新資訊28at.com

2.3.3 可以鏈式調用,自定義重試邏輯:C4m28資訊網——每日最新資訊28at.com

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

主要優點是:C4m28資訊網——每日最新資訊28at.com

  • 線程安全的異步請求
  • 自動重試失敗任務
  • 簡潔的鏈式編程方式
  • 避免阻塞主線程

C4m28資訊網——每日最新資訊28at.com

使用并發框架可以便捷地實現異步重試機制,提高系統容錯性。其他框架如RxJava也有類似的重試機制。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

2.4 消息隊列重試

使用消息隊列可以實現接口請求的異步重試機制。C4m28資訊網——每日最新資訊28at.com

基本思路是:C4m28資訊網——每日最新資訊28at.com

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

主要步驟:C4m28資訊網——每日最新資訊28at.com

  • 創建請求重試隊列,如“request.retry.queue”
  • 接口請求失敗后,生成重試消息,發送到隊列
  • 消費者啟動線程從隊列中取消息重試
  • 根據重試策略進行定時重試或最大重試數
  • 成功則確認消息,失敗則重新入隊

使用消息隊列進行重試有利于:C4m28資訊網——每日最新資訊28at.com

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

C4m28資訊網——每日最新資訊28at.com

示例C4m28資訊網——每日最新資訊28at.com

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

這就是使用消息隊列實現接口重試的基本流程,可以根據需求擴展重試策略、異常處理等邏輯。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

2.5 自定義重試工具類

使用自定義的重試工具類來實現接口請求的重試機制,提高代碼的復用性和可維護性。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

重試工具類的實現思路:C4m28資訊網——每日最新資訊28at.com

  • 提供重試方法,參數包括請求函數、重試策略等
  • 在重試方法內部執行循環請求
  • 每次請求失敗時,根據策略等待一段時間
  • 記錄當前重試次數,與最大次數比較
  • 請求成功或者達到最大重試次數則結束循環

C4m28資訊網——每日最新資訊28at.com

示例:C4m28資訊網——每日最新資訊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();      // 重試次數加1      retries++;    }  }}}// 執行請求的函數接口interface RetryCallable<T> {T call();}// 重試策略class RetryPolicy {int maxRetries;int delay;}// 使用示例RetryUtil.retry(() -> {// 接口請求return httpClient.get(url);}, policy);

這樣可以提高重試相關邏輯的復用性,避免寫重復代碼。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

2.6 使用遞歸結構

使用遞歸結構也可以實現接口請求的重試機制。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

基本思路是設計一個遞歸函數,在函數內部發送請求,如果失敗則繼續遞歸調用自身再次重試。C4m28資訊網——每日最新資訊28at.com

示例:C4m28資訊網——每日最新資訊28at.com

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

C4m28資訊網——每日最新資訊28at.com

主要邏輯是通過遞歸不斷調用自身來實現重試。優點是邏輯較簡單清晰,缺點是遞歸層次過深時可能會導致堆棧溢出。需要合理設置最大遞歸深度,也可以通過循環改寫遞歸來避免深層遞歸。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

2.7 使用Resilience4j

Resilience4j是一個很好的Java重試庫,可以用它來實現接口請求的重試機制。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

主要步驟:C4m28資訊網——每日最新資訊28at.com

2.7.1添加Resilience4j依賴C4m28資訊網——每日最新資訊28at.com

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

2.7.2 定義重試邏輯C4m28資訊網——每日最新資訊28at.com

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

2.7.3 使用重試邏輯調用接口C4m28資訊網——每日最新資訊28at.com

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

2.7.4 自定義重試異常predicateC4m28資訊網——每日最新資訊28at.com

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

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

C4m28資訊網——每日最新資訊28at.com

2.8 使用網絡工具重試

我們常用的一些網絡工具來做重試C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

示例C4m28資訊網——每日最新資訊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發送請求      return HttpClientUtils.get(url);           } catch (Exception e) {      if (retries >= MAX_RETRIES) {        throw e;      }             // 增加重試次數      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);}}// 網絡工具類class HttpClientUtils {public static String get(String url) throws IOException {  // 發送GET請求并返回結果}}

C4m28資訊網——每日最新資訊28at.com

主要通過循環和網絡工具類來實現重試邏輯,延時控制也可以用Random來實現指數退避。這種 utilities + 循環 的組合可以實現靈活可復用的重試機制。C4m28資訊網——每日最新資訊28at.com

3.注意事項

圖片圖片C4m28資訊網——每日最新資訊28at.com

接口請求重試時需要注意以下幾點:C4m28資訊網——每日最新資訊28at.com

3.1 冪等性接口需要是冪等的,多次調用結果相同,避免重復執行帶來副作用。C4m28資訊網——每日最新資訊28at.com

3.2 資源競爭重試可能對服務端造成更大壓力,需要考慮限流等措施。C4m28資訊網——每日最新資訊28at.com

3.3 超時設置合理設置重試最大次數和總超時時間,避免長時間等待。C4m28資訊網——每日最新資訊28at.com

3.4 重試條件明確哪些異常情況下需要重試,不能無腦重試所有錯誤。C4m28資訊網——每日最新資訊28at.com

3.5 數據一致性請求成功后要冪等更新狀態,避免重復數據。C4m28資訊網——每日最新資訊28at.com

3.6 異步機制重試過程不要阻塞主業務線程。C4m28資訊網——每日最新資訊28at.com

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

3.8 日志記錄記錄重試的次數、錯誤原因等信息,方便排查問題。C4m28資訊網——每日最新資訊28at.com

3.9 容錯機制重試失敗后的降級處理,避免級聯失敗。C4m28資訊網——每日最新資訊28at.com

C4m28資訊網——每日最新資訊28at.com

總結

接口請求重試機制對保證系統高可用非常關鍵,需要根據業務需求選擇合適的重試策略。常用的組合策略包括帶最大次數的定時/指數退避重試、故障轉移重試等。重試機制需要綜合設置以達到容錯效果 又避免產生過大的系統負載。C4m28資訊網——每日最新資訊28at.com

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 提升應用性能:Go中的同步與異步處理

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

標簽:
  • 熱門焦點
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 轎車從天而降電動車主被撞身亡 超速搶道所致:現場視頻讓網友吵翻

    近日,上海青浦區法院判決轎車從天而降電動車主被撞身亡案,轎車車主被判有期徒刑一年。案件顯示當時男子駕駛轎車在上海某路段行駛,前車忽然轉彎提速超車,
  • Raft算法:保障分布式系統共識的穩健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可復制、可冗余、可容錯”)的首字母縮寫。Raft算法是一種用于在分布式系統
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
Top 主站蜘蛛池模板: 土默特右旗| 定襄县| 舞钢市| 酒泉市| 大厂| 剑河县| 年辖:市辖区| 高碑店市| 当雄县| 长治市| 辽宁省| 普陀区| 灵璧县| 沙河市| 潮安县| 明溪县| 苗栗县| 佳木斯市| 盘山县| 鄂伦春自治旗| 酒泉市| 通道| 勃利县| 涟源市| 秦皇岛市| 郎溪县| 梁平县| 班玛县| 临城县| 杭锦后旗| 漳州市| 扎赉特旗| 靖远县| 桐庐县| 盖州市| 蒲江县| 赣榆县| 弥渡县| 灵川县| 邯郸市| 天峻县|