35dc950e4f
- ADR-001: 单体应用架构选型 - ADR-002: 响应式编程选型 - ADR-003: 数据库选型 - 记录架构决策的背景、理由、影响和演进路径
3.2 KiB
3.2 KiB
ADR-002: 响应式编程选型
文档编号: GYM-ADR-002
版本: v1.0
日期: 2026-03-04
作者: 张翔
状态: 已采纳
状态
已采纳
决策时间
2026-03-04
决策背景
健身房管理系统需要支持高并发场景(预约高峰期、签到高峰期),传统阻塞式编程模型无法满足性能需求。
决策内容
采用 Spring WebFlux + R2DBC 响应式编程模型,而非传统的 Spring MVC + JPA。
决策理由
1. 性能优势明显
| 性能指标 | Spring MVC + JPA | WebFlux + R2DBC | 提升幅度 |
|---|---|---|---|
| 并发连接数 | 200-500 | 2000-5000 | 10x |
| API响应时间(P99) | 500-800ms | 200-400ms | 50%↓ |
| 吞吐量(QPS) | 500-1000 | 3000-5000 | 5x |
| 内存占用 | 2-4GB | 512MB-1GB | 75%↓ |
| CPU利用率 | 60-80% | 40-60% | 25%↓ |
| 线程数 | 200-500 | 10-20 | 95%↓ |
2. 资源利用率高
- 非阻塞I/O模型
- 少量线程处理大量请求
- 内存占用低
3. 适合高并发场景
- 预约高峰期(每天18:00-20:00)
- 签到高峰期(每天9:00-10:00、18:00-19:00)
- 支付流程(实时性要求高)
4. 统一技术栈
- 全栈响应式编程
- 从Web层到数据访问层统一模型
- 代码风格一致
替代方案
Spring MVC + JPA(传统阻塞式)
优势:
- 团队熟悉度高
- 生态成熟
- 调试简单
- 学习成本低
劣势:
- 并发能力有限
- 资源占用高
- 线程阻塞模型
不选择原因:
- 无法满足高并发需求
- 资源利用率低
- 性能瓶颈明显
影响范围
- 技术栈选型
- 代码编写方式
- 测试方法
- 调试技巧
- 团队培训
后果
正面影响
- ✅ 并发能力提升10倍
- ✅ 响应时间降低50%
- ✅ 资源利用率提升75%
- ✅ 服务器成本降低60%
负面影响
- ⚠️ 学习曲线陡峭(需要4-6周培训)
- ⚠️ 调试难度增加
- ⚠️ 生态相对不成熟
- ⚠️ 代码可读性降低
前提条件
1. 团队培训
- 响应式编程基础(1周)
- WebFlux实战(2周)
- R2DBC实战(1周)
- 性能调优(1周)
2. 代码审查
- 100%代码审查覆盖
- 响应式编程规范检查
- 性能测试验证
3. 监控体系
- 响应式指标监控
- 背压机制监控
- 错误处理监控
风险缓解
风险1:团队学习曲线
- 缓解措施:安排4-6周培训,建立代码审查机制
- 应急方案:关键模块由资深工程师负责
风险2:调试困难
- 缓解措施:建立完善的日志体系,使用响应式调试工具
- 应急方案:关键路径增加日志输出
风险3:生态不成熟
- 缓解措施:选择成熟的响应式库,避免使用实验性功能
- 应急方案:关键功能准备阻塞式降级方案
相关文档
参考资料
- Spring WebFlux官方文档
- R2DBC规范文档
- Reactor核心库文档
- 响应式编程实战