tag

响应式编程

共 51 篇文章。
全部文章书稿GoJavaTypeScript互联网产品游戏开发独立开发者小游戏游戏服务端架构设计游戏设计Godot性能优化Rust
java

9.3 Sinks 重放:大小与时间限制

讲解 Sinks.Many.replay() 的五种策略:all() 无限历史、limit(n) 保留最近 n 个、limit(Duration) 按 TTL 淘汰、limit(n, Duration) 同时受限、latest() 只留最新值。实测 late subscriber 在 limit(3) 下只收到 [2,3,4]、只 request(1) 时只收到 1 个元素,证明重放仍受下游背压约束;并给出 latestOrDefault、过期后无新元素、完成后订阅的真实输出。示例基于 reactor-core 3.8.8。

4 分钟阅读
书稿 Java 响应式编程
java

9.2 Sinks 多播:背压与重放

用实跑对比 Sinks.Many 多播的三种背压策略:directBestEffort 只丢慢订阅者自己的元素,directAllOrNothing 只要一人无需求就让所有人收不到并返回 FAIL_OVERFLOW,onBackpressureBuffer 用共享队列导致队头阻塞,慢订阅者不补齐需求时快订阅者也拿不到元素。实测缓冲区容量取整(1→1、2/3/5→8、10→16)、默认 256,以及 busyLooping 只重试 FAIL_NON_SERIALIZED、不挽救 FAIL_OVERFLOW。示例基于 reactor-core 3.8.8。

5 分钟阅读
书稿 Java 响应式编程
java

9.1 Sinks:程序化发射数据

讲解 Reactor Sinks API 的设计目标——在 Publisher 外部程序化地发射数据。对比 unicast、multicast、replay 三种 Many 工厂的订阅模型与零订阅者行为,实测 tryEmitNext 的 EmitResult 语义、emitNext 在 FAIL_OVERFLOW 时会终止整条 sink,以及并发发射实测出现的 FAIL_NON_SERIALIZED,纠正「Sinks 线程安全、可任意线程发射」的误解。示例基于 reactor-core 3.8.8。

4 分钟阅读
书稿 Java 响应式编程
java

8.3 refCount、autoConnect 与 cache

对比 refCount(n)、autoConnect(n)、replay()、replay(n) 与 cache() 的启动时机、断开条件、后订阅者行为与内存代价。实测 refCount(1) 在订阅归零时取消源、在源完成后重新订阅源,autoConnect(1) 在订阅者全部取消后仍持续运行,replay(2) 只给后订阅者回放最近 2 个元素,cache(2) 只保留最近 2 个元素给后订阅者。示例基于 reactor-core 3.8.8。

5 分钟阅读
书稿 Java 响应式编程
java

8.2 Hot Publisher:广播与共享

深入讲解 Hot Publisher 的语义:源流独立于订阅存在,late subscriber 只能收到订阅之后的元素。用 Flux.create 手工驱动 publish、connect,确定性演示后订阅者丢失历史;实测 autoConnect(n) 的连接阈值、refCount(1) 在订阅归零时断开并在下次订阅时重新连接,并纠正「Hot Publisher 无背压、会无限缓冲」的误解。示例基于 reactor-core 3.8.8。

5 分钟阅读
书稿 Java 响应式编程
java

8.1 Cold Publisher:每次订阅重放

系统讲解 Cold Publisher 的语义:数据流与订阅绑定,每次 subscribe 独立启动新序列、重新执行副作用。用实跑输出对比 Flux.range 的重复订阅、Mono.fromCallable 的重复调用、Mono.cache 的成功与失败缓存、Flux.cache(n) 对后订阅者只回放最近 n 个元素,并区分 just 的急切求值与 fromCallable 的延迟求值。示例基于 reactor-core 3.8.8。

4 分钟阅读
书稿 Java 响应式编程
java

7.3 背压策略:Error 与请求发射速率控制

讲清 onBackpressureError 的快速失败语义,以及 limitRate、limitRate(highTide, lowTide)、limitRequest 三种请求控制手段的真实行为。用 doOnRequest 实测 limitRate(10) 的请求序列 [10, 8, 8, ...] 与 75% 补请求规则,实测 limitRequest(5) 取满即完成、limitRequest(0) 不订阅上游,并给出 Flux.create + onRequest 的生产端限流写法。示例基于 reactor-core 3.8.8。

7 分钟阅读
书稿 Java 响应式编程
java

7.2 背压策略:Drop Latest 与 Drop Oldest

区分 onBackpressureDrop、onBackpressureLatest 与 onBackpressureError 的真实语义:三者都向上游请求 Long.MAX_VALUE,只在下游没有需求时丢弃或覆盖。用确定性订阅实验实测「无需求」和「先请求 1 个」两种情况下保留与丢弃的元素,说明 delayElements 一次只请求一个元素因而会触发丢弃,并给出状态面板、日志采集与快速失败的选型边界。示例基于 reactor-core 3.8.8。

6 分钟阅读
书稿 Java 响应式编程
java

6.3 自定义调度器与 Worker 模型

从 Scheduler/Worker 的真实接口契约出发,手写一个可运行的 LoggingScheduler:直接调度与 Worker 串行调度的区别、Worker.dispose 的取消语义、Scheduler.dispose 对 Worker 的回收,以及延迟/周期调度默认被拒绝的原因。再用 reactor-test 的 VirtualTimeScheduler 演示 StepVerifier 虚拟时间与手动 advanceTimeBy 两种测试方式,并给出按 key 分区和包装现有调度器的完整实现。示例基于 reactor-core 3.8.8、reactor-test 3.8.8。

9 分钟阅读
书稿 Java 响应式编程
java

6.2 BoundedElastic 与线程池模型

深入 BoundedElastic 的实现:最多 10×CPU 个单线程 worker、每 worker 10 万任务队列、60 秒空闲 TTL,以及「空闲优先、再新建、最后选最闲 worker」的分配策略。用 reactor-core 3.8.8 实测线程创建、复用、回收与队列拒绝,区分直接 schedule 抛异常和 subscribeOn 转成 onError 两种表现,并说明 JDK 21+ 虚拟线程模式与 ExecutorService 的本质差异。

7 分钟阅读
书稿 Java 响应式编程
java

6.1 调度器:单线程、弹性、并行与立即

系统讲解 Reactor 四种内置调度器的线程模型:single 的单线程 FIFO、boundedElastic 的 10×CPU 上限与 10 万/线程队列、parallel 的核数线程与轮询分配、immediate 的调用线程执行。用 reactor-core 3.8.8 实跑输出对比线程名、线程创建数量与任务排队行为,并纠正「boundedElastic 只有 CPU 个线程」「parallel 能让单条流并行」等常见误解。

6 分钟阅读
书稿 Java 响应式编程
java

5.3 超时与取消传播

讲清 timeout(Duration) 的真实语义——首元素超时与元素间隔超时,而不是整个流的总时长;对比 take(Duration) 的完成语义。用实测代码展示取消信号如何向上游传播、doFinally 放在不同位置看到的信号差异、Disposable/CompositeDisposable 的生命周期管理,以及 timeout 无法中断同步阻塞调用的原因与替代方案。示例基于 reactor-core 3.8.8。

6 分钟阅读
书稿 Java 响应式编程
java

5.2 指数退避重试与熔断信号

剖析 retryWhen(Retry) 的 companion 协议:手写 companion 正常完成会向下游发 onComplete 并吞掉原始异常(实测),正确做法是在重试耗尽时显式发出原始错误。对比 Retry.fixedDelay、Retry.backoff、Retry.max 的订阅次数、退避序列与异常类型,给出线性/指数退避的可运行实现、重试与熔断的边界,以及避免无限重试和惊群的配置模板。示例基于 reactor-core 3.8.8。

8 分钟阅读
书稿 Java 响应式编程
java

4.3 组合操作符:zip、merge、combineLatest

对比 zip(配对等待)、merge(先到先发)、combineLatest(最新值组合)三种组合操作符的语义差异,说明它们在元素数量不对等、时序差异、错误传播场景下的行为。重点讲清 zip 的木桶效应与有界预取、merge 的 prefetch 回压(不是无限缓冲)、combineLatest 的初始等待陷阱,以及三种操作符在生产中的选型。

5 分钟阅读
书稿 Java 响应式编程