在响应式编程中,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; …