当前位置: 首页 > news >正文

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.dtcms.com/a/263122.html

相关文章:

  • NLP文本数据增强
  • 配置conda虚拟环境时出现ProxyError怎么解决?
  • Ollama 深度使用指南:在本地玩转大型语言模型
  • OpenLayers 自定义拖动事件
  • Webpack优化详解
  • 运营商智能化升级:破局客服、外呼、质检的“数智神经中枢”革命
  • torchvision中的数据使用
  • Maven 中,dependencies 和 dependencyManagement
  • 临床试验中基线数据缺失的处理策略
  • synetworkflowopenrestydpdk
  • Spring Boot + ONNX Runtime模型部署
  • 6阶段实现最强RAG 模块化检索增强 实践指南
  • [springboot系列] 探秘JUnit 5: Java单元测试利器
  • Redis 和 Mysql 如何保证数据一致性
  • 底盘结构---履带式运动模型
  • 快速手搓一个MCP服务指南(八):FastMCP 代理服务器:构建灵活的 MCP 服务中介层
  • HTML<input>元素详解
  • 《用奥卡姆剃刀原理,为前端开发“减负增效”》
  • 《微信生态裂变增长利器:推客小程序架构设计与商业落地》
  • python训练day45 Tensorborad使用介绍
  • Linux 日志监控工具对比:从 syslog 到 ELK 实战指南
  • 阶段二开始-第一章—8天Python从入门到精通【itheima】-121节+122节(函数和方法的类型注解+Union联合类型注解)
  • 【运维系列】【ubuntu22.04】安装GitLab
  • 2025年光学工程、精密仪器与光电子技术国际会议(OEPIOT 2025)
  • Armbian 25.5.1 Noble Gnome 开启远程桌面功能
  • 百度文心ERNIE 4.5 大模型系列正式开源
  • Windows 安装 nodejs npm
  • 数据生命周期管理实战:建、用、管、存、归档到销毁的全流程治理
  • 如何用废弃电脑变成服务器搭建web网站(公网访问零成本)
  • 24V转12V降压实际输出12.11V可行性分析