双 11 零点峰值的脉冲流量,如何用泊松过程+队列长度估算瞬时最大并发

解读

  1. 面试官想验证候选人能否把“数学模型”与“电商大促”这两个看似割裂的领域打通,而不是背八股文。
  2. 双 11 零点流量呈“秒级脉冲”:0 点 0 分 0 秒~5 秒内请求密度从 0 飙到峰值,随后 30 秒内缓慢回落;传统“平均并发”已失真,必须估算“瞬时最大并发 N_max”。
  3. 泊松过程给出“单位时间到达率 λ(t)”,队列长度给出“系统可容忍的积压 L_max”,两者联立即可反推“在目标 RT 和成功率约束下,系统到底能扛住多少并发”。
  4. 回答时要体现“可落地”:给出参数怎么采、公式怎么算、最后怎么变成容量预案,而不是只写数学式子。

知识点

  1. 非齐次泊松过程 NHPP:λ(t) 随时间变化,适合描述“零点脉冲”。
  2. Little 定律:L = λ · W,其中 L 为平均队列长度,W 为平均逗留时间。
  3. M/M/c/K 近似:把网关/接入层抽象成“c 个线程 + K 个等待位”,用于估算排队概率 P_drop。
  4. 峰值放大因子 α:国内电商经验值 1.8~2.5,用于把“5 秒平均 λ”放大到“1 秒瞬时 λ_peak”。
  5. SLA 反向约束:99.9% 请求 RT ≤ 500 ms ⇒ 最大排队等待 Wq ≤ 300 ms(留 200 ms 给 service time)。
  6. 观测工具:阿里云 PTS 可秒级聚合 QPS,ARMS 可输出队列长度,数据可直接喂给模型。

答案

步骤 1:采集真实 λ(t)
用去年双 11 零点前 2 min 的网关日志,按 1 s 切片统计 QPS,得到 λ(0),λ(1),…,λ(300)。取最大 5 秒窗口平均值得 λ_5s = 28 万 QPS,乘以峰值放大因子 α = 2.2,得瞬时峰值到达率
λ_peak = λ_5s · α = 616 k QPS。

步骤 2:确定最大可接受队列长度 L_max
业务 SLA:RT 99线 ≤ 500 ms,网关 service time 均值 S = 30 ms(压测报告给出)。
由 Kingman 近似,排队等待
Wq ≈ (ρ^(√(2(c+1)))) / (c·μ(1-ρ)) ,
其中 ρ = λ_peak/(c·μ),μ = 1/S ≈ 33.3 /s。
把 Wq ≤ 300 ms 作为约束,反解 c,可得最小线程数 c_min = 2.4 万。
再用 Little 定律,最大队列长度
L_max = λ_peak · Wq_max = 616 k × 0.3 s ≈ 185 k 请求。

步骤 3:估算瞬时最大并发 N_max
瞬时并发 = 正在服务的 + 正在排队的。
N_max = c_min + L_max = 2.4 万 + 18.5 万 ≈ 21 万。
向上取整并留 20% buffer,最终零点入口集群按 25 万并发做预热和限流阈值。

步骤 4:验证与回滚
双 11 前一周,用 PTS 制造 25 万并发脉冲 5 s,观察队列长度是否逼近 18 万、RT 99线是否破 500 ms;若破,则把 c_min 上调 10% 或降级非核心链路,重新计算即可。

拓展思考

  1. 泊松假设在“零点脉冲”里其实偏乐观:真实流量有“用户客户端时钟误差 + 秒杀按钮动画”导致 200 ms 内突发叠加,可用“批量到达模型 M^[X]/M/c”修正,放大系数再提高 15%。
  2. 如果系统做了“本地令牌队列 + 异步漏斗”,排队不再发生在网关线程,而发生在令牌桶,此时 L_max 应换成“桶内等待令牌数”,公式不变但参数需从网关线程池改为令牌生成速率。
  3. 双 11 后应把“实测 N_max”与“模型 N_max”做回归,沉淀为第二年的 α 经验值,持续修正泊松-队列模型,最终形成“一页 Excel 就能算容量”的内部工具,降低沟通成本。