第 9 章 · 容量规划与成本估算
本章用 可计算公式 + k6 压测基线 + 小紫云成本模型,把「感觉够用」变成可复核的容量表,直接作为 L3 交付物。
前置:ch03 扩展性、ch08 综合案例;PaaS ch15;跟练 ch16。
9.1 容量规划四步法
① 业务预测 → ② 压测基线 → ③ 资源换算 → ④ 成本与冗余评审
贯穿案例:社区电商大促
| 项 | 数值 |
|---|---|
| 日常/大促 DAU | 80万 / 200万 |
| 人均订单 | 0.4 单/天 |
| 大促 2h 订单占比 | 45% |
| SLA | P99<400ms,可用性 99.95% |
| 现状 | order-api 3副本 2C4G |
9.2 流量估算(手算例题)
公式 A:日均峰值段
峰值 QPS = DAU × 人均次数 / 86400 × 峰值系数
200万 × 0.4 / 86400 × 5 ≈ 46.3 QPS
公式 B:大促集中窗口(设计值)
峰值 QPS = DAU × 人均订单 × 集中度 / 大促秒数
= 2000000 × 0.4 × 0.45 / 7200 ≈ 50 QPS(下单写)
公式 C:秒杀毛刺(Top 1% 分钟,2% 日单)
毛刺 QPS = 2000000 × 0.4 × 0.02 / 60 ≈ 267 QPS
公式 D:网关并发
并发 ≈ Σ(QPS × 平均RT秒) × (1+余量)
下单50×0.15 + 商品200×0.05 + 列表150×0.08 ≈ 29.5 → +30% ≈ 38
公式 E:全站等效 QPS(下单占写 25%,读:写=3:1)
全站 ≈ 50/0.25 × 4 = 800 QPS
9.3 k6 压测与副本公式
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 20 }, { duration: '5m', target: 60 },
{ duration: '3m', target: 100 }, { duration: '2m', target: 0 },
],
thresholds: { http_req_failed: ['rate<0.001'], http_req_duration: ['p(99)<400'] },
};
export default function () {
const res = http.post('http://order-api.staging/api/v1/orders',
JSON.stringify({ userId:`u-${__VU}`, skuId:'SKU-BENCH', qty:1 }),
{ headers:{'Content-Type':'application/json'} });
check(res, { '201': r => r.status===201 });
sleep(0.1);
}
压测结果(单 Pod 2C4G)
| VU | QPS | P99 | 错误率 | CPU% |
|---|---|---|---|---|
| 20 | 95 | 120ms | 0% | 42 |
| 40 | 175 | 280ms | 0% | 68 |
| 60 | 210 | 380ms | 0.1% | 82 |
| 80 | 228 | 520ms | 1.4% | 95 |
结论:安全水位 QPS≤180(P99<400ms,错误<0.1%)。
副本数 = ceil(目标QPS / 单Pod安全QPS × (1+冗余率))
| 场景 | 计算 | 工程取值 |
|---|---|---|
| 大促 50 QPS,冗余35% | ceil(50/180×1.35)=1 | 3(N+1+跨AZ) |
| 毛刺 267 QPS | ceil(267/180×1.35)=2 | 6(ch16 ARB) |
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: order-api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: order-api
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70