# 1. Reactor Hooks.onErrorDropped 与 onOperatorError 的差异化处理策略? A onErrorDropped 用于处理操作符执行过程中抛出的所有异常 B 两者都是兜底机制,用于可观测性,不应替代正常错误处理 ✓ 正确答案 C onOperatorError 用于处理下游已取消但上游仍推送错误信号的情形 D 全局钩子注册后会自动禁止错误被传播到订阅者
# 2. BaseSubscriber 与背压手动控制 A 它会自动请求上游的所有元素并使用内部缓冲 B 覆写 hookOnNext 后会自动取消订阅 C 它只适用于 Mono 类型,不适用于 Flux D 默认不请求元素,需在 hookOnSubscribe 中调用 request(n) 控制背压 ✓ 正确答案
# 3. 热流与冷流(Hot/Cold Publisher)的语义差异与 connect/share 实现 A 冷流的所有订阅者共享同一份数据,在订阅前就已产生 B 热流的每个订阅者都会获得一份独立完整的序列 C ConnectableFlux 调用 connect() 后,每个订阅者仍会重建数据源 D share() 等价于 publish().refCount(1),第一个订阅者到来时自动连接 ✓ 正确答案
# 4. 响应式背压(Backpressure)策略,BUFFER/LATEST/DROP/ERROR 在生产中如何取舍? A onBackpressureBuffer(无界) B onBackpressureLatest ✓ 正确答案 C onBackpressureError D onBackpressureDrop
# 5. Mono.defer / Mono.cache 在生命周期敏感的请求作用域中如何避免缓存泄露? A 全局静态的 Mono.cache 实例会导致请求作用域数据被跨请求复用 ✓ 正确答案 B Mono.defer 会把第一次订阅的结果缓存并复用 C Mono.cache 每次订阅都会重新执行外层逻辑 D Mono.defer 用于缓存结果以提升性能
# 6. Schedulers.boundedElastic() 的线程策略 A 线程数无上限,可无限创建以应对并发 B 与 Netty EventLoop 线程模型相同 C 只能用于 CPU 密集型计算任务 D 适合执行阻塞式 IO,有线程数上限且有界队列 ✓ 正确答案
# 7. Mono(0..1)与 Flux(0..N)的语义 A Mono 一定产生 1 个元素,Flux 最多产生 1 个元素 B 两者都只能产生有限个元素 C Flux.collectList() 可以将 Flux 聚合为 Mono<List> ✓ 正确答案 D Mono 是同步的,Flux 是异步的
# 8. Processor 同时实现 Publisher 与 Subscriber 时如何避免背压丢失与泄漏,为什么官方建议谨慎自定义 Processor A 强烈推荐自定义 Processor 以实现灵活控制 B 自定义 Processor 永远不会发生背压丢失 C 建议使用 Sinks 与 Flux.create 等高层 API 替代自定义 Processor ✓ 正确答案 D Processor 与 Sinks 完全等价,无区别
# 9. Reactive Streams 的四要素,Publisher/Subscriber/Subscription/Processor 的契约如何? A onError 发出后仍可继续调用 onNext B Subscriber 的方法可以被并发调用以提高吞吐 C cancel 之后订阅者仍会收到 onNext D onNext 的数量不能超过订阅者请求的总数(无界请求除外) ✓ 正确答案
# 10. 背压的实现,request(n) 与 onNext 的节奏控制,Publisher 如何避免溢出? A 生产者可以无视 request 数量无限发送 onNext B request(n) 表示订阅者还能接收 n 个元素,生产者据此控制发送节奏 ✓ 正确答案 C request(n) 只能调用一次,之后不能再请求 D 背压只适用于同步流,不适用于异步流
# 11. 自定义 Subscriber 的实现要点,onSubscribe 中 request、cancel 与串行化 onNext A onNext 必须被串行化调用,且终止后不得再调用 ✓ 正确答案 B request(n) 只需在 onSubscribe 中调用一次即可无限接收 C cancel 之后仍可继续调用 onNext D onSubscribe 中不调用 request 也能自动收到元素
# 12. Reactive Streams TCK(技术兼容测试)的作用与自定义实现验证 A 用于编译 Reactor 项目 B 与规范无关,是性能测试工具 C 用于验证自定义 Publisher/Subscriber 实现是否符合规范 ✓ 正确答案 D 只能测试 Flux,不能测试 Mono
# 13. Subscription.request(n) 与 n 的合法边界 A n 必须大于 0,Long.MAX_VALUE 表示无界请求 ✓ 正确答案 B 多次 request 的请求量不会累加 C n 为 0 表示请求 0 个元素,合法 D n 可以为负数,表示取消
# 14. Project Reactor 的线程模型,Schedulers 各策略与 publishOn/subscribeOn 的差异如何? A publishOn 影响其下游操作符的执行线程,subscribeOn 影响订阅链的订阅与执行线程 ✓ 正确答案 B subscribeOn 只影响 publishOn 之后的下游线程 C publishOn 影响其上游操作符的执行线程 D 两者效果完全等价,无差别
# 15. 响应式流的异常处理,onError 后订阅终止,重试/熔断如何在外层封装? A onError 后可以在同一订阅内继续处理数据 B onError 不会终止订阅,只是忽略 C retry() 通过重新订阅上游实现重试 ✓ 正确答案 D 熔断与重试是相互排斥的,不能组合
# 16. 响应式与虚拟线程的对比,什么场景响应式仍优于阻塞+虚拟线程? A 需要内置背压与流式组合的场景,响应式仍优于阻塞 + 虚拟线程 ✓ 正确答案 B 响应式无法处理流式数据 C 虚拟线程天然内置背压能力 D 虚拟线程无法并发处理阻塞 IO
# 17. 背压信号 request 的语义,多订阅者与并发请求如何累积处理? A 多次 request(n) 的额度不会累加,只取最后一次 B 多订阅者共享同一个信用额度 C request 只用于取消,不用于拉取数据 D 多次 request(n) 的信用额度会累加,并发累加需保证原子性 ✓ 正确答案
# 18. 响应式流中的背压丢失,无界 request 与内存溢出的风险如何? A 无界 request 不会带来内存风险 B request(Long.MAX_VALUE) 会关闭背压保护,若下游处理慢导致数据堆积,可能引发内存溢出 ✓ 正确答案 C 背压丢失只影响性能,不影响内存 D 有界缓冲不会溢出,无需监控