全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《Java 响应式编程·Reactive Streams 与背压原理》 |
| 篇数 | 50 篇(14 章 42 节 + 序、前言、目录 + 附录 A–E) |
| 领域 | Reactive Streams 规范实现、Project Reactor 核心、背压原理、RS TCK 合规验证 |
| 贯穿项目 | eventd-v1 —— 自实现 RS Publisher → Project Reactor 重写 → 背压演示系统 |
| 阅读方式 | 从目录篇 进入按顺序通读,或按机制跳读 |
| 主线版本 | JDK 25 LTS(Temurin 25.0.5+8)、Project Reactor BOM 2025.0.8、RxJava 3.1.12 |
| 关键依赖 | reactor-core 3.8.8(BOM 2025.0.8)、rxjava 3.1.12、reactive-streams-tck 1.0.4 |
| 上级专题 | 书稿专题 |
三卷分工
| 卷 | 书名 | 关注点 |
|---|---|---|
| 卷一 | 《Java 响应式编程·Reactive Streams 与背压原理》 | RS 规范、Reactor 核心、背压策略、RS TCK 合规 |
| 卷二 | 《Java 响应式编程·系统构建与数据访问》 | Reactor Netty、WebFlux、R2DBC、响应式安全与测试 |
| 卷三 | 《Java 响应式编程·流处理引擎与实时计算》 | Kafka Streams、Flink DataStream、窗口、CEP |
本卷不展开 Reactor Netty/WebFlux(留给卷二),不展开 Kafka Streams/Flink(留给卷三)。需要时写「卷二第 N 章」「卷三第 N 章」。
全书目录
前置
| 篇 | 文章 | 核心内容 |
|---|---|---|
| 序 | 序:从回调地狱到背压契约 | 回调地狱三宗罪、RS 规范的诞生、三卷分工、本书不承诺什么 |
| 前言 | 前言:环境、项目与读法 | 读者对象、前置知识、环境清单、eventd-v1 骨架、代码约定 |
| 目录 | 目录与学习路径 | 三条学习路径、三卷衔接、章节索引 |
第一部分:Reactive Streams 规范(第 1 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 1.1 | 异步编程的演进 | 回调、Promise/Future、CompletableFuture 的局限;为什么需要「流」 |
| 1.2 | Reactive Streams 规范:四个接口 | Publisher/Subscriber/Subscription/Processor;43 条规则概述 |
| 1.3 | 规范规则逐条分析 | onSubscribe 先调用、request 信号、onNext 与 request 关系、取消与完成、空 Publisher |
第二部分:从零实现 Publisher(第 2–3 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 2.1 | 同步 Publisher 最小实现 | 单值同步 Publisher、标准 subscribe 流程、request(n) 同步响应 |
| 2.2 | 异步 Publisher 与背压信号 | 异步生产、Subscription 内 request 累积、Executor 调度、取消传播 |
| 2.3 | Subscriber 实现与信号契约 | onSubscribe 内保存 Subscription、request 与 cancel 线程安全、onNext 不阻塞 |
| 3.1 | Processor:Subscriber 与 Publisher 的桥接 | Processor 同时实现两者;桥接场景(编码转换、日志、指标) |
| 3.2 | 操作符链:map、filter、take | 懒订阅、每个操作符返回新 Publisher、request 信号转发与变换 |
| 3.3 | 调度切换:subscribeOn 与 publishOn | 订阅线程 vs 发射线程;Executor 作为调度器;信号不能乱序 |
第三部分:Project Reactor 核心(第 4–7 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 4.1 | Mono 与 Flux:零个、一个与多个元素 | Mono |
| 4.2 | 转换操作符:map、flatMap、concatMap | 同步变换 vs 异步展开;flatMap 合并无序、concatMap 顺序保证 |
| 4.3 | 组合操作符:zip、merge、combineLatest | 配对发射 vs 先 emit 先赢 vs 最新值组合;空流与错误传播 |
| 5.1 | 错误处理:onErrorReturn、onErrorResume、retry | 错误恢复策略、重试次数与退避、retryWhen 与 Repeat 区别 |
| 5.2 | 指数退避重试与熔断信号 | retryWhen 配合 Flux.interval、固定退避 vs 指数退避 |
| 5.3 | 超时与取消传播 | timeout(Duration) 语义、取消信号向上游传播、doOnCancel 钩子 |
| 6.1 | 调度器:单线程、弹性、并行与立即 | Schedulers.single/elastic/parallel/immediate;线程名与线程数边界 |
| 6.2 | BoundedElastic 与线程池模型 | 有界弹性调度器(线程上限、队列、TTL);与 ExecutorService 的关系 |
| 6.3 | 自定义调度器与 Worker 模型 | Scheduler.Worker 生命周期、任务排队、取消粒度 |
| 7.1 | 背压策略:Buffer | onBackpressureBuffer() 无界/有界队列、溢出策略、钩子 |
| 7.2 | 背压策略:Drop Latest 与 Drop Oldest | onBackpressureDrop / onBackpressureLatest 语义;丢元素回调 |
| 7.3 | 背压策略:Error 与请求发射速率控制 | onBackpressureError、limitRate(n)、limitRequest(n);请求批量化 |
第四部分:Hot 与 Cold、Sinks、多播(第 8–10 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 8.1 | Cold Publisher:每次订阅重放 | 创建即启动 vs 订阅即启动;多次订阅独立数据流 |
| 8.2 | Hot Publisher:广播与共享 | publish().refCount()、share();late subscriber 只能收到后续元素 |
| 8.3 | refCount、autoConnect 与 cache | refCount(n)、autoConnect(n)、cache 的内存与重放权衡 |
| 9.1 | Sinks:程序化发射数据 | Sinks.many().unicast/multicast/replay;线程安全发射;失败类型 |
| 9.2 | Sinks 多播:背压与重放 | multicast().onBackpressureBuffer / .directBestEffort;重放缓存大小限制 |
| 9.3 | Sinks 重放:大小与时间限制 | replay().limit(n) / .limit(Duration) / .latest();内存管理与失效策略 |
| 10.1 | RxJava Subject:与 Sinks 的对照 | PublishSubject、BehaviorSubject、ReplaySubject、AsyncSubject |
| 10.2 | ConnectableObservable 与 connect | RxJava 的 publish + connect / refCount;与 Reactor ConnectableFlux 对照 |
| 10.3 | RxJava 3 与 Reactor 的迁移对照 | API 映射表、共同陷阱、何时选哪个库 |
第五部分:RS TCK 测试与合规验证(第 11 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 11.1 | RS TCK:测试环境搭建 | PublisherVerification/SubscriberVerification/IdentityProcessorVerification |
| 11.2 | Publisher 合规测试 | 38 个用例(22 个 required);信号顺序、背压、空 Publisher、异步完成 |
| 11.3 | Subscriber 与 Processor 合规测试 | SubscriberWhitebox/Blackbox、IdentityProcessorVerification |
第六部分:调试与生命周期(第 12 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 12.1 | 生命周期钩子:doOn* 系列 | doOnSubscribe/doOnNext/doOnError/doOnComplete/doOnCancel/doOnRequest |
| 12.2 | 调试技术:Hooks 与检查点 | Hooks.onOperatorDebug、checkpoint 订阅点追踪、性能代价 |
| 12.3 | 装配时 vs 订阅时 | 操作符链是蓝图、订阅才是启动;多次订阅多次执行 |
第七部分:eventd v1 验收(第 13–14 章)
| 节 | 文章 | 核心内容 |
|---|---|---|
| 13.1 | eventd v1 架构与模块划分 | eventd-core(RS 实现)、eventd-app(背压演示 App)、模块依赖 |
| 13.2 | 传感器模拟器:带背压的随机数据流 | SensorSimulatorPublisher:Poisson 到达、可配置速率、request(n) 响应 |
| 13.3 | 背压演示面板:请求率 vs 消费率 | BackpressureDashboard:统计 request 累积、onNext 处理时间、buffer/drop 数量 |
| 14.1 | 用 Project Reactor 重写 eventd | 同一套业务逻辑:Flux.create + BoundedElastic + onBackpressureBuffer |
| 14.2 | eventd v1 性能基线 | 吞吐量(元素/秒)、延迟分布(p50/p99)、不同背压策略资源占用 |
| 14.3 | v1 验收:RS 合规、背压可观测、文档 | TCK 全绿、三种背压策略演示、模块 README |
附录
| 附录 | 文章 | 核心内容 |
|---|---|---|
| A | Reactor/RxJava 操作符速查 | 分类表(创建/变换/组合/错误/背压/工具)、操作符对照、适用场景 |
| B | 调度器选择指南 | 四种场景 → 推荐调度器 → 反例 |
| C | 背压规则清单 | RS 规范背压相关规则逐条 + Reactor 实现映射 |
| D | 从 CompletableFuture 到响应式流迁移指南 | CompletableFuture → Mono/Flux 映射、常见陷阱、何时不要迁移 |
| E | RS TCK 测试方法参考 | PublisherVerification/SubscriberVerification 全部方法列表 |
与站内已有内容的边界
- 不写 Netty 组件源码:ByteBuf 引用计数、EventLoop 源码已在《Netty 高性能网络编程》展开;本卷只在调度器章节引用线程池模型。
- 不写 Spring WebFlux:自动配置、容器启动已在《Spring Boot 高级》第 8 章展开;本卷从 RS 规范写到背压实现,卷二衔接 WebFlux。
- 不写 Kafka Producer/Consumer API:kafka-clients 已在《Java 消息中间件·核心概念与 API》展开;卷三只写 Kafka Streams DSL。
- 不写 JMM/AQS 源码:已在《Java 并发编程》三卷展开;本卷只在调度器章节引用 Executor 模型。