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

Reactor Hot Versus Cold

这段文字详细解释了 Reactor 中 热发布者(Hot Publisher)冷发布者(Cold Publisher) 的区别,并通过示例展示了它们的行为差异。以下是对其含义的总结和解释:


1. 冷发布者(Cold Publisher)

  • 定义:冷发布者在订阅时才开始生成数据。如果没有订阅者,数据不会被生成。

  • 行为:每个订阅者都会独立地触发数据的生成和处理流程。

  • 类比:就像 HTTP 请求,每个订阅者都会触发一次新的请求,即使之前已经有人订阅过。

  • 示例

    Flux<String> source = Flux.fromIterable(Arrays.asList("blue", "green", "orange", "purple")).map(String::toUpperCase);
    source.subscribe(d -> System.out.println("Subscriber 1: " + d));
    source.subscribe(d -> System.out.println("Subscriber 2: " + d));
    

    输出结果:

    Subscriber 1: BLUE
    Subscriber 1: GREEN
    Subscriber 1: ORANGE
    Subscriber 1: PURPLE
    Subscriber 2: BLUE
    Subscriber 2: GREEN
    Subscriber 2: ORANGE
    Subscriber 2: PURPLE
    

    每个订阅者都会接收到所有数据,因为每个订阅都会重新执行整个操作链 。

在这里插入图片描述


2. 热发布者(Hot Publisher)

  • 定义:热发布者在创建时就开始发布数据,不依赖于订阅者的数量。即使没有订阅者,数据也会持续发布。

  • 行为:订阅者只会看到从订阅开始之后发布的数据。如果在订阅之前已经发布了数据,新订阅者不会看到这些数据。

  • 类比:就像一个股票价格发布者,一旦价格发生变化,所有订阅者都会收到更新,但新订阅者只会看到之后的价格变化。

  • 示例

    Sinks.Many<String> hotSource = Sinks.unsafe().many().multicast().directBestEffort();
    Flux<String> hotFlux = hotSource.asFlux().map(String::toUpperCase);
    hotFlux.subscribe(d -> System.out.println("Subscriber 1 to Hot Source: " + d));
    hotSource.emitNext("blue", FAIL_FAST); 
    hotSource.tryEmitNext("green").orThrow(); 
    hotFlux.subscribe(d -> System.out.println("Subscriber 2 to Hot Source: " + d));
    hotSource.emitNext("orange", FAIL_FAST); 
    hotSource.tryEmitNext("purple").orThrow(); 
    

    输出结果:

    Subscriber 1 to Hot Source: BLUE
    Subscriber 1 to Hot Source: GREEN
    Subscriber 1 to Hot Source: ORANGE
    Subscriber 1 to Hot Source: PURPLE
    Subscriber 2 to Hot Source: ORANGE
    Subscriber 2 to Hot Source: PURPLE
    

    第二个订阅者只看到 “orange” 和 “purple”,因为它们是在第一个订阅者之后发布的 。

在这里插入图片描述


3. 如何将冷发布者转换为热发布者

  • share():将冷发布者转换为热发布者,多个订阅者可以共享同一个发布者。第一个订阅者触发发布,后续订阅者共享数据。
  • replay(n):将冷发布者转换为热发布者,并保留最近的 n 个元素,新订阅者可以接收到这些元素。
  • Sinks.Many:通过 Sinks.Many 手动控制数据的发布,可以模拟热发布者的行为 。

4. 如何将热发布者转换为冷发布者

  • defer():将热发布者(如 just)转换为冷发布者,延迟执行,直到有订阅者订阅时才生成数据 。

5. 总结

  • 冷发布者:每个订阅者都会独立地触发数据的生成和处理。
  • 热发布者:数据在创建时就开始发布,订阅者只会看到从订阅开始之后的数据。
  • 转换方法
    • 冷 → 热:share()replay()Sinks.Many
    • 热 → 冷:defer()

这种区分对于构建高效、可扩展的响应式系统非常重要,尤其是在处理大量并发请求或实时数据流时 。

http://www.dtcms.com/a/263739.html

相关文章:

  • 比Axure更简单?墨刀高保真原型交互“监听变量”使用教程
  • 基于中国印尼会计准则差异,中国企业在印尼推广ERP(SAP、Oracle)系统需要注意的细节
  • 应用场景全解析:飞算 JavaAI 的实战舞台
  • python+uniapp基于微信小程序的适老化背景下老年人康养知识线上学习系统nodejs+java
  • C++ 11 中 condition_variable 的探索与实践
  • 解锁阿里云日志服务SLS:云时代的日志管理利器
  • 【AI 时代的网络爬虫新形态与防护思路研究】
  • iOS 越狱插件 主动调用C函数和OC函数
  • DBA 命令全面指南:核心操作、语法与最佳实践
  • 【仿muduo库实现并发服务器】Channel模块
  • 大规模分布式数据库读写分离架构:一致性、可用性与性能的权衡实践
  • opencv使用 GStreamer 硬解码和 CUDA 加速的方案
  • Java ArrayList 扩容机制
  • 【MobaXterm、Vim】使用合集1
  • 结构体实战:用Rust编写矩形面积计算器
  • Electron 沙箱模式深度解析:构建更安全的桌面应用
  • Let‘s Encrypt 免费证书使用
  • 2022/7 N2 jlpt词汇
  • STM32作为主机识别鼠标键盘
  • Vue-16-前端框架Vue之应用基础集中式状态管理pinia(一)
  • SeaTunnel 社区月报(5-6 月):全新功能上线、Bug 大扫除、Merge 之星是谁?
  • 从零到一搭建远程图像生成系统:Stable Diffusion 3.5+内网穿透技术深度实战
  • 密码学(斯坦福)
  • 数字图像处理学习笔记
  • 电机控制的一些笔记
  • CentOS Stream 下 Nginx 403 权限问题解决
  • jQuery UI 安装使用教程
  • 使用Spring Boot 原始的文件下载功能,告别下载风险!
  • Python实例题:基于 Flask 的任务管理系统
  • 数据结构:递归:组合数(Combination formula)