第3章:容量(Capacity)
一、导读
1.1 本章学习目标
第3章讲解容量规划和资源管理。理解系统的容量限制,是防止生产事故的关键。
1.2 为什么第三章如此重要
很多生产事故的根因是容量不足——数据库连接耗尽、线程池满、内存溢出。正确的容量规划可以避免这些问题。
1.3 核心问题引导
如何评估系统的容量?
负载测试如何进行?
弹性伸缩如何实现?
资源管理有哪些最佳实践?
二、核心概念详解
3.1 容量评估
关键指标:
- QPS(每秒查询数)
- 响应时间(P50, P95, P99)
- 并发连接数
- 内存使用量
- CPU 使用率
- 磁盘 I/O3.2 负载测试
java
// 使用 JMeter 或 Gatling 进行负载测试
// 模拟真实用户行为
// 逐步增加负载
// 观察系统表现
// 关键指标
// - 吞吐量:系统每秒处理的请求数
// - 响应时间:请求从发出到收到响应的时间
// - 错误率:失败的请求比例
// - 资源利用率:CPU、内存、磁盘、网络的使用率3.3 弹性伸缩
水平扩展:增加更多实例
- 优点:简单、线性扩展
- 缺点:需要无状态设计
垂直扩展:升级单个实例的配置
- 优点:简单
- 缺点:有上限、成本高
自动伸缩:根据负载自动调整实例数
- 基于 CPU 使用率
- 基于请求队列长度
- 基于自定义指标3.4 资源管理
连接池:
- 数据库连接池:HikariCP
- HTTP 连接池:Apache HttpClient
- 线程池:ThreadPoolExecutor
关键参数:
- 最大连接数
- 最小空闲连接数
- 连接超时时间
- 空闲连接存活时间三、实战案例
3.1 容量规划
场景:电商平台大促
预估流量:
- 日常 QPS:1000
- 大促峰值 QPS:10000(10倍)
容量规划:
- 应用服务器:10台 → 50台
- 数据库:读写分离,3个从库 → 5个从库
- 缓存:Redis 集群扩容
- CDN:增加带宽
负载测试:
- 模拟 10000 QPS
- 观察响应时间和错误率
- 找到瓶颈并优化四、本章小结
容量规划是生产就绪的关键。通过负载测试评估系统容量,使用弹性伸缩应对流量峰值,合理管理连接池和线程池资源。
五、思考与练习
如何评估系统的最大容量?
负载测试如何进行?
水平扩展和垂直扩展如何选择?
连接池大小如何设置?
如何处理突发流量?