Reactor 瞬態錯誤

在響應式編程中,retryWhen 操作符通過 RetrySignal 接口提供了對重試行為的精細控制,特別是在處理 瞬態錯誤(transient errors) 時。瞬態錯誤是指那些在一段時間內發生,但隨后會自行恢復的錯誤,例如網絡請求失敗后服務器短暫不可用,但隨后恢復正常。在這種情況下,我們希望每個錯誤“爆發”(burst)都能獨立處理,而不是將前一次的重試狀態帶入下一次。


1. 瞬態錯誤的定義與場景

瞬態錯誤通常表現為短暫的失敗,隨后系統會恢復。例如,一個 HTTP 請求源可能會在某些條件下連續失敗兩次,然后恢復正常。這種模式在長期運行的流(如 Kafka 消費者、HTTP 請求等)中非常常見。


2. RetrySignal 的作用

RetrySignalretryWhen 操作符中用于表示重試狀態的接口。它提供了兩個關鍵方法:

  • totalRetries():返回到目前為止的總重試次數(單調遞增)。
  • totalRetriesInARow():返回當前連續失敗的次數。如果在重試中成功恢復(即接收到 onNext 而不是 onError),這個值會被重置為 0。

這個 totalRetriesInARow() 的值是處理瞬態錯誤的關鍵。它允許我們區分“連續失敗”和“獨立失敗”,從而實現更合理的重試策略。


3. transientErrors(boolean) 配置的作用

當在 RetrySpecRetryBackoffSpec 中設置 transientErrors(true) 時,重試策略將使用 totalRetriesInARow() 來計算重試次數。這意味著:

  • 每次重試失敗后,如果成功恢復(即接收到 onNext),則 totalRetriesInARow() 會被重置為 0。
  • 每次“爆發”(即連續失敗)都會被獨立處理,重試次數不會累積。

這種配置特別適用于處理瞬態錯誤,例如網絡請求失敗后服務器短暫不可用的情況。


4. 示例代碼解析

// 用于生成數據和控制流的輔助變量
final AtomicInteger transientHelper = new AtomicInteger();
// 模擬HTTP請求的Flux數據流
Supplier<Flux<Integer>> httpRequest = () ->Flux.generate(sink -> {int i = transientHelper.getAndIncrement();if (i == 10) {sink.next(i);sink.complete();}else if (i % 3 == 0) {sink.next(i);}else {sink.error(new IllegalStateException("Transient error at " + i));}});
// 用于統計錯誤次數的變量
AtomicInteger errorCount = new AtomicInteger();
// 添加錯誤處理邏輯的Flux
Flux<Integer> transientFlux = httpRequest.get().doOnError(e -> errorCount.incrementAndGet());// 使用retryWhen進行重試,最多重試2次,并且認為所有錯誤都是暫時性的
transientFlux.retryWhen(Retry.max(2).transientErrors(true)).blockLast();
assertThat(errorCount).hasValue(6);
  • doOnError:用于統計錯誤次數。
  • retryWhen(Retry.max(2).transientErrors(true))
    • Retry.max(2) 表示最多重試 2 次。
    • transientErrors(true) 表示啟用瞬態錯誤處理模式。
  • blockLast():等待整個流完成。
  • assertThat(errorCount).hasValue(6):驗證總共發生了 6 次錯誤,說明重試機制成功處理了 6 次錯誤。

5. 關鍵區別:啟用 transientErrors(true) 與不啟用

  • 啟用 transientErrors(true)

    • 每次重試失敗后,如果成功恢復,totalRetriesInARow() 會被重置為 0。
    • 每次“爆發”(連續失敗)都會被獨立處理,重試次數不會累積。
    • 最終成功完成,錯誤次數為 6 次。
  • 不啟用 transientErrors(true)

    • 重試次數是單調遞增的,不會重置。
    • 如果第二次“爆發”導致重試次數超過 2 次,整個序列將失敗。

6. 總結

  • retryWhen 通過 RetrySignal 提供了對重試行為的精細控制。
  • totalRetriesInARow() 是處理瞬態錯誤的關鍵,它允許我們區分“連續失敗”和“獨立失敗”。
  • transientErrors(true) 配置使得每次“爆發”都能獨立處理,重試次數不會累積,從而避免了因前一次失敗而放棄后續重試的問題。
  • 這種機制特別適用于處理網絡請求、數據庫連接等可能遇到瞬態錯誤的場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87271.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 SpringBoot+Vue.js+ElementUI 的小型超市商品管理系統設計與實現7000字論文設計

摘要 本論文設計并實現了一個基于 SpringBoot、Vue.js 和 ElementUI 的小型超市商品管理系統。該系統旨在為小型超市提供一個高效、便捷的商品管理解決方案&#xff0c;實現商品信息的錄入、查詢、修改、刪除等功能&#xff0c;同時支持庫存管理、銷售統計等業務需求。論文首先…

Kerberos 認證協議解析

文章目錄 概述核心概念認證流程階段一&#xff1a;Client -> AS&#xff0c;獲取 TGT階段二&#xff1a;Client -> TGS&#xff0c;獲取服務票據階段三&#xff1a;Client -> Server&#xff0c;請求服務 核心安全機制優缺點分析優勢局限性 實踐與排錯關鍵配置 (krb5.…

【設計模式07】適配器

前言 實現目標&#xff0c;組合源&#xff0c;寫個適配方法&#xff0c;適用于沒辦法改變源&#xff0c;但又想實現目標類。我暫時還沒使用到過&#xff0c;但感覺用處還是蠻大的 UML類圖 代碼示例 package com.sw.learn.pattern.C_structre.a_adapter;public class Main {//…

SPI、I2C和UART三種串行通信協議的--------簡單總結

目錄 一、3種協議的對比二、典型應用場景三、選型建議 以下是SPI、I2C和UART三種串行通信協議的對比分析及適用場景總結&#xff1a; 一、3種協議的對比 . 對比其他接口 特性ICSPIUART信號線數量2&#xff08;SCL SDA&#xff09;4&#xff08;SCK MOSI MISO SS/CS&…

VUE admin-element 后臺管理系統三級菜單實現緩存

VUE admin-element 后臺管理系統三級菜單實現緩存 框架無法直接實現三級菜單頁面緩存&#xff0c;原因是由于直接緩存時沒有把上級路由文件名稱緩存進去&#xff0c;所以在框架基礎上參考部分文章進行了一些改造 菜單文件&#xff0c;三級菜單引用文件路徑修改&#xff0c;在…

【筆記】Windows 安裝 Gemini CLI

2025 年 07 月 02 日 Windows 安裝 Gemini CLI google-gemini/gemini-cli&#xff1a;一個開源的 AI 代理&#xff0c;可將 Gemini 的強大功能直接引入您的終端。 一、前置條件 系統要求&#xff1a;Windows 7 及以上版本。 Node.js 環境&#xff1a;Gemini CLI 基于 Node.js …

transformers==4.42.0會有一個BUG

transformers4.42.0版本下&#xff0c;自動安裝模型時出現一個BUG&#xff08;自動從Hugging Faces上下載&#xff09;。 2025-07-02 14:07:08,641 - __main__ - ERROR - 模型加載失敗: Failed to import transformers.models.llama.tokenization_llama_fast because of the f…

Spring-解決IDEA中無法創建JDK17一下的SpringBoot項目

目錄 一.直接創建 二.修改Server URL為https://start.aliyun.com 一.直接創建 目前如果使用https://start.spring.io&#xff08;Spring官方源&#xff09;,已經沒有辦法直接創建JDK17一下的項目了&#xff1a; 如果想要創建JDK8的項目&#xff0c;可以先通…

人工智能-基礎篇-13-基礎應用篇-2~~模型項目開發流程--從0到1創建類似DeepSeek語言模型,應該怎么做?

1、前期準備 1、明確目標與需求分析 應用場景定義&#xff1a;首先需要明確你的模型將用于哪些場景&#xff0c;比如對話系統、文本生成、代碼輔助等。性能指標設定&#xff1a;確定關鍵性能指標(KPI)&#xff0c;如準確率、響應時間、支持的語言種類等。 2、組建團隊 機器…

本周滬鋁想法

核心邏輯&#xff1a;低庫存支撐與淡季需求疲軟博弈&#xff0c;宏觀情緒助推高位震蕩 一、成本下移 VS 價格韌性? 成本端與價格表現呈現出不同態勢。成本端方面&#xff0c;氧化鋁現貨價格在本周持續下跌&#xff0c;山東地區均價降至 3090 元 / 噸&#xff0c;環比下降 1.…

【網絡】SSL/TLS介紹

一、SSL/TLS 概述 SSL&#xff08;Secure Socket Layer&#xff09; &#xff1a; 最初由網景&#xff08;Netscape&#xff09;開發&#xff0c;用于在客戶端和服務器之間建立安全的加密連接&#xff0c;防止數據被竊取或篡改。后來逐步演進&#xff0c;最終被 TLS 取代。 TL…

TLF35584

13、SPI串行外設接口 13.1 介紹 主要功能 SPI 總線是?種以全雙工模式運行的同步串行數據鏈路。TLF35584 在從機模式下進行通信&#xff0c;其中主機(μC)啟動數據幀。TLF35584應該通過專用片選線進行尋址。這允許其他從設備連接到SPI總線。 數據傳輸 開始通信&#xff0c;μ…

word中如何保存高清圖片,并保存為高質量的pdf文件(圖像不失真)

word中如何保存高清圖片 打開word,選擇&#xff0c;選項&#xff0c;高級選項&#xff0c;選擇不壓縮文件中的圖像并保持分辨率高保真 將word保存為高質量的pdf文件 不用另存為或者導出 選擇文件&#xff0c;選擇打印&#xff1a; 選擇中間都打印出pdf即可。 然后再選擇打印…

Day03_C語言IO進程線程

01.思維導圖 02.創建一個進程扇 #include <25051head.h> int main(int argc, const char *argv[]) {pid_t pid;int i;for(i0;i<4;i){pidfork();if(pid0){//printf("子進程:pid[%d]\n",pid);printf("子進程%d:子進程pid[%d],父進程pid[%d]\n",i1,g…

獲取Qwen 2.5 內部網絡結構 講解

獲取Qwen 2.5 內部網絡結構 講解 Qwen2DecoderLayer( (self_attn): Qwen2Attention( (q_proj): Linear(in_features=2048, out_features=2048, bias=True) (k_proj): Linear(in_features=2048, out_features=256, bias=True) (v_proj): Linear(in_features=2048, out_features…

在深度學習中,batch、epoch 和 iteration 的關系

用一個實際例子和簡單代碼來清晰解釋 batch、epoch 和 iteration 的關系&#xff1a; ------------------------------------------------------------------------------------ 假設場景 你有一個數據集&#xff1a;1000 張貓狗圖片 你設置 batch_size 100&#xff08;每次…

RabbitMQ 高級特性之持久性

1. 簡介 在 RabbitMQ 的消息發送流程中&#xff0c;一共有三種消息丟失的情況&#xff1a; 生產者給 broker 發送的消息&#xff0c;broker 沒有收到broker 將消息丟失broker 給消費者發送消息時消息丟失 對于第一種情況&#xff0c;我們可以使用 RabbitMQ 提供的發布確認模…

應急響應靶機-近源OS-1-知攻善防實驗室

前景需要&#xff1a; 小王從某安全大廠被優化掉后&#xff0c;來到了某私立小學當起了計算機老師。某一天上課的時候&#xff0c;發現鼠標在自己動彈&#xff0c;又發現除了某臺電腦&#xff0c;其他電腦連不上網絡。感覺肯定有學生搗亂&#xff0c;于是開啟了應急。 1.攻擊…

Linux 內存管理與緩存機制

文章目錄 內存介紹buff/cache 與匿名頁Swap&#xff08;交換空間&#xff09;&#xff1a;內存的臨時倉庫 內存回收與Swap機制內存頁的兩種類型內核回收決策流程如何解讀內存狀態drop_caches 參數說明 實踐操作查看內存狀態查看Swap狀態釋放 buff/cache 緩存 內存介紹 當使用 …

【嵌入式電機控制#6】編碼器原理與內部構造

一、簡介 編碼器是一種將直線位移和角位移數據轉換為脈沖信號、二進制編碼的設備。常用于測量物體運動的位置、角度或速度。 二、分類 1. 按檢測分類&#xff1a; &#xff08;1&#xff09;光電式編碼器 &#xff08;2&#xff09;磁電式編碼器 2. 編碼類型分類&#xff1a; …