需求预测
从历史趋势、季节性和业务事件预测需求以预置容量。
为什么
自动扩缩是反应性 — 它在流量到后扩,意尖峰首 2-5 分钟跑不足容量(延迟尖、错误)。对可预测尖峰(黑五、产品发布、营销邮件发),预测让你预置:尖峰前 30 分钟扩,故流量到时容量就绪。预测合历史趋势(流量月增 5%)、季节性(Q4 流量翻倍)和业务事件(10 点营销邮件 1h 内 3x 流量)。这把容量从反应性抢("服务挂了,立即扩!")变计 划操作("我们预期 10 点 3x 流量,9:50 预扩")。预测并预置的团队报预测事件中容量相关事件少 90%,因容量已在。
何时使用
对可预测事件:季节峰、产品发布、营销发送和已知流量模式。
如何做
1. 收集历史流量数据 - 按服务请求率,按小时,过去 12-24 月 - 识别季节性:日(工作時)、周(工作日 vs 周末)、年(Q4 峰) 2. 拟预测模型 - 简单:线性增长 + 季节分解(statsmodels、Prophet) - 高级:带特征 ML 模型(营销花、周几、假日) - 别过拟;80% 对的简单模型胜错的复杂模型 3. 纳入业务事件 - 营销:"10 点邮件发 → 预期 1h 3x 流量" → 9:50 预扩 - 产品:"周二发布 → 预期 2 天 10x 流量" → 周一预扩 - 销售:"黑五 → 预期 5x 流量" → 周三预扩 4. 预测尖峰前预置容量 - 尖峰前 30m 扩(给 pod 暖、缓存填时间) - 尖峰退后 30m 缩(省成本) - 用计划扩缩(K8s HPA 带计划或调副本的 cron job) 5. 跟踪预测准确度并改 - "预测 3x,实际 2.5x" → 超配 20%,可 - "预测 3x,实际 5x" → 欠配,事件;改模型 - 预测准确度是指标;季度审查
示例
# 预测(Prophet,checkout 服务):
model = Prophet(yearly_seasonality=True, weekly_seasonality=True)
model.fit(history) # 24 月小时结账流量
future = model.make_future_dataframe(periods=168, freq='H') # 下 7 天
forecast = model.predict(future)
# 预测:黑五(11 月 24)→ 5x 正常流量,10 点-20 点
# 预置(K8s 计划 HPA):
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: checkout
spec:
behavior:
scaleUp:
stabilizationWindowSeconds: 0 # 立即扩
metrics:
- type: Resource
resource:
name: cpu
target: { type: Utilization, averageUtilization: 70 }
---
# 黑五前计划扩:
apiVersion: v1
kind: CronJob
metadata:
name: checkout-black-friday-pre-scale
spec:
schedule: "0 9 24 11 *" # 11 月 24 9 点(尖峰前 1h)
jobTemplate:
spec:
template:
spec:
containers:
- name: kubectl
command: ["kubectl", "scale", "deploy/checkout", "--replicas=50"]
# 预测准确度跟踪:
# 黑五 2025:预测 5x,实际 4.8x → 超 4%,✅
# 产品发布:预测 10x,实际 15x → 欠 33%,⚠ 改模型
# 营销邮件:预测 3x,实际 3.1x → 超 3%,✅常见问题
- ⚠仅靠自动扩缩 — 它反应性故尖峰首 2-5m 跑不足容量;为可预测事件预置。
- ⚠预测模型是黑盒 — 错时无人知为什么;用简单可解释模型并跟踪准确度。
- ⚠预扩太晚 — 10 点尖峰 10 点扩意 pod 未就绪;前 30m 扩。
- ⚠无预测准确度跟踪 — 模型每次错但无人注意因无指标;跟踪预测 vs 实际。
最佳实践
- ✓从历史趋势 + 季节性 + 业务事件预测;预测尖峰前 30m 预置使流量到时容量就绪。
- ✓用简单可解释模型(线性 + 季节分解、Prophet);季度跟踪预测 vs 实际准确度。
- ✓合 预测与反应性自动扩缩:预测处理可预测尖峰,自动扩缩处理不可预测余。
- ✓尖峰退后 30m 缩省成本;预置为尖峰非永久超配。