WebFlux 与响应式编程

共 29 题
#

1. AIO 在 Spring WebFlux 的应用

A WebFlux 基于 Netty 的事件循环(NIO 多路复用)实现非阻塞,而非依赖 JDK AIO ✓ 正确答案
B WebFlux 使用 JDK AIO 作为核心
C WebFlux 采用线程-per-请求
D WebFlux 与背压无关
#

2. Reactor 的 Context 如何替代 ThreadLocal 在订阅链中逆向传播,为什么它与调用线程无关

A Context 绑定线程,线程切换丢失
B Context 随订阅链逆向传播,与执行线程无关,线程切换也不丢失 ✓ 正确答案
C Context 与 ThreadLocal 相同
D Context 只能从上游到下游
#

3. Reactor 的背压(Backpressure)如何通过 request(n) 协议向上游传递需求,onBackpressureBuffer/Drop/Latest 各自适用什么场景

A request(n) 与背压无关
B 背压是上游强推
C 三种操作符行为相同
D 下游 request(n) 向上游传递需求,Buffer 缓冲、Drop 丢弃、Latest 保留最新,按场景选择 ✓ 正确答案
#

4. WebFlux 基于 Netty EventLoop 的线程模型为何禁止阻塞调用,一次 JDBC 阻塞会怎样拖垮整个事件循环

A 阻塞调用只影响当前请求
B EventLoop 线程被阻塞会拖垮其所有连接,阻塞调用应隔离到 boundedElastic 或改用非阻塞 ✓ 正确答案
C EventLoop 有多个线程,阻塞无影响
D JDBC 阻塞是安全的
#

5. 使用 NIO Selector 实现的简易 HTTP 服务器与 Spring WebFlux 的背压控制相比,吞吐量上限有多大差距

A 两者吞吐完全相同
B 差距主要来自背压控制与事件循环优化,而非非阻塞 IO 本身 ✓ 正确答案
C 简易实现背压更好
D WebFlux 无用
#

6. 虚拟线程(Project Loom)出现后,"是否还需要 Reactive/WebFlux"成为 Java 后端最热争论——两者的适用场景边界如何划分?

A Reactive 无法处理流式
B 虚拟线程使 Reactive 完全无用
C 虚拟线程解决并发,Reactive 解决流式/背压/非阻塞,二者互补按业务选型 ✓ 正确答案
D 虚拟线程能模拟背压
#

7. 已有 WebFlux/Reactor 代码库迁移到虚拟线程的渐进策略,哪些模块先迁、哪些保留 Reactive,双栈共存期间的注意事项如何?

A 简单阻塞业务先迁,流式/背压模块保留 Reactive,双栈共存需边界清晰与资源隔离 ✓ 正确答案
B 所有模块一次性迁移
C 先迁流式模块
D 双栈共存无注意事项
#

8. Spring Boot 3.2+ 中 spring.threads.virtual.enabled=true 开启后,Spring MVC 的线程模型如何变化?与 WebFlux 的功能差异还剩什么?

A MVC 虚拟线程获得并发,但 WebFlux 的流式、背压、非阻塞组合仍不可替代 ✓ 正确答案
B 开启后 MVC 与 WebFlux 完全等价
C MVC 也能做背压
D 差异在并发能力
#

9. 虚拟线程的 thread-per-request 模型与 Reactive 的 event-loop 模型在吞吐量、延迟、资源占用上的实测对比数据如何解读?

A 两者资源占用相同
B 虚拟线程吞吐远低于 Reactive
C Reactive 内存占用最低
D IO 密集场景吞吐接近,虚拟线程内存更省代码更简单,Reactive 在流式/极低延迟有优势 ✓ 正确答案
#

10. JEP 491 修复前 synchronized 与 JNI 阻塞导致的虚拟线程钉住(pinning)如何影响 Reactive 选型决策?如何检测和规避?

A 钉住不影响并发
B 钉住使虚拟线程在 synchronized/JNI 阻塞时无法让出载体线程,JEP 491 修复 synchronized 钉住 ✓ 正确答案
C JEP 491 只修复 JNI
D 无法检测钉住
#

11. publishOn 与 subscribeOn 对订阅链中线程切换的作用范围与执行位置差异

A 两者都只影响下游
B subscribeOn 影响订阅与上游执行,publishOn 影响其下游 operator 的执行线程 ✓ 正确答案
C subscribeOn 影响下游
D 两者作用完全相同
#

12. 响应式事务为何不能用基于 ThreadLocal 的 @Transactional,TransactionalOperator 与 @Transactional 在 R2DBC 下的编程差异

A 响应式线程切换使 ThreadLocal 的 @Transactional 失效,R2DBC 用 TransactionalOperator 编程式管理事务 ✓ 正确答案
B @Transactional 在 R2DBC 下可用
C TransactionalOperator 基于 ThreadLocal
D 响应式事务与线程无关
#

13. 在响应式链路中需要调用阻塞库时,boundedElastic 调度器的作用与线程上限、队列拒绝行为如何配置

A 阻塞调用无需隔离
B 阻塞调用应在事件循环线程执行
C boundedElastic 无界
D 用 subscribeOn(boundedElastic) 隔离阻塞调用,有界线程上限防资源耗尽 ✓ 正确答案
#

14. 如何用可控分片、慢消费者和连接重置测试 Selector 服务的半包、背压与故障清理语义

A 背压无需测试
B 半包与分片无关
C 可控分片测半包重组、慢消费者测背压、连接重置测故障清理 ✓ 正确答案
D 连接重置无需清理
#

15. Mono 与 Flux 的语义差异是什么,empty/just/defer/fromCallable 等工厂方法在订阅时机上有何不同

A 所有工厂方法都立即执行
B Mono 与 Flux 相同
C Mono 0-1 元素、Flux 0-N 元素,defer/fromCallable 延迟到订阅时执行,just/empty 立即 ✓ 正确答案
D defer 立即执行
#

16. Reactor 与虚拟线程在 Spring Boot 3.2+ 的实际差异,阻塞 JDBC 调用如何在 reactive 应用中定位?

A 阻塞 JDBC 在 reactive 中安全
B 阻塞 JDBC 会阻塞事件循环线程,应通过线程分析/BlockHound 定位并隔离或改用 R2DBC ✓ 正确答案
C 阻塞调用无影响
D 无法定位阻塞调用
#

17. 虚拟线程与 WebFlux 选型错误的回滚成本如何评估?

A 两者回滚成本相同
B 虚拟线程同步范式回滚成本低,WebFlux 响应式范式回滚成本高,选型应谨慎 ✓ 正确答案
C WebFlux 回滚成本最低
D 回滚成本与范式无关
#

18. 虚拟线程下数据库连接池(HikariCP)的瓶颈如何显现?为什么"百万虚拟线程"可能只有 50 个数据库连接可用?

A 虚拟线程大量并发但数据库连接池有限,实际 DB 并发受连接池大小限制 ✓ 正确答案
B 虚拟线程可无限扩展数据库并发
C 连接池无上限
D 虚拟线程直接访问数据库
#

19. Structured Concurrency + Scoped Values 与 Reactor Context 在上下文传播上的对比,哪个更适合复杂业务链路?

A ScopedValues 适合响应式
B 两者等价
C ScopedValues 适合同步/虚拟线程结构化并发,Reactor Context 适合响应式链,按并发模型选择 ✓ 正确答案
D Reactor Context 适合同步
#

20. Kotlin 协程与 Java 虚拟线程的互操作,suspend 函数如何在虚拟线程上运行,kotlinx-coroutines-reactor 的桥接模式如何?

A 协程与 Reactor 无法互操作
B suspend 可配置在虚拟线程运行,kotlinx-coroutines-reactor 桥接协程与 Reactor 类型 ✓ 正确答案
C suspend 只能在平台线程运行
D 桥接只能单向
#

21. 响应式编程在流式处理(无限流、窗口聚合、背压)场景下仍不可替代的原因是什么?虚拟线程能否模拟这些语义?

A 虚拟线程能模拟背压
B 无限流、窗口聚合、背压是响应式流式原语,虚拟线程并发模型无法模拟 ✓ 正确答案
C 响应式与流式无关
D 虚拟线程可做窗口聚合
#

22. Flux.cache 与 Flux.replay 在热点数据缓存中的应用与内存边界

A replay 只缓存一个元素
B cache 不占用内存
C cache 缓存结果供多订阅共享,但无限流/大数据量会耗尽内存,需用 size 限制 ✓ 正确答案
D 内存边界无需考虑
#

23. WebClient 的连接超时、响应超时与重试(retryWhen)配置及与重试幂等的配合

A 连接/响应超时 + retryWhen 重试,重试需配合幂等并控制退避 ✓ 正确答案
B 重试无需幂等
C 超时无法配置
D 重试无限次数
#

24. WebClient 的 exchangeToMono 与 retrieve 在响应体释放和错误处理上的差异,未消费响应体会导致什么连接泄漏

A 两者都自动释放
B retrieve 自动处理响应体,exchangeToMono 更底层但需手动消费 body,否则连接泄漏 ✓ 正确答案
C 未消费响应体无影响
D exchangeToMono 自动释放连接
#

25. 响应式链路中异常如何沿 onError 传播,onErrorResume/onErrorReturn/doFinally 在资源清理与降级中的分工

A onErrorResume/onErrorReturn 做降级,doFinally 保证资源清理,分工明确 ✓ 正确答案
B doFinally 做降级
C onErrorReturn 做清理
D 错误无法降级
#

26. 虚拟线程池下 ScheduledExecutorService 的兼容性边界在哪?

A 定时调度需固定线程池语义,虚拟线程池按任务创建,建议用固定调度器而非虚拟线程池 ✓ 正确答案
B 虚拟线程池适合定时调度
C 两者语义相同
D 定时任务必须用虚拟线程
#

27. 在 JDK 21+ 异步 HTTP 客户端(java.net.http.HttpClient)上虚拟线程的弹性优势?

A 必须用异步 sendAsync
B 虚拟线程下同步 send 阻塞时挂起,无需异步回调即可高并发,编程更简单 ✓ 正确答案
C 同步 send 会占满平台线程
D 虚拟线程无弹性优势
#

28. 团队技术选型决策框架,什么团队规模/业务特征/技术债水平下选 Reactive,什么条件下选虚拟线程?

A 所有团队都选 Reactive
B 只按团队规模选
C 按团队技能、业务特征(流式/背压 vs 常规)、技术债综合评估,虚拟线程默认、Reactive 用于明确需求 ✓ 正确答案
D 技术债无关
#

29. StepVerifier 的虚拟时间(withVirtualTime)如何测试定时操作与背压行为

A 虚拟时间只能测响应
B 虚拟时间要真实等待
C 无法测试背压
D withVirtualTime 用虚拟时钟快进定时操作,thenRequest 控制请求验证背压 ✓ 正确答案