验证码与通知洪峰
→ 返回 高并发
登录、注册、找回密码、营销推送在活动开始或故障恢复时会产生「短信 / 邮件 / Push」写洪峰。与秒杀不同,这里不能靠超卖,而要严格控频、防刷、保护下游通道。
典型问题
| 问题 | 后果 |
|---|
| 同一手机号短时间重复请求 | 用户骚扰、通道费用暴涨 |
| 同一 IP / 设备刷接口 | 撞库、羊毛党、通道被封 |
| 通道 QPS 上限 | 供应商 429、全站发不出 |
| 验证码校验打 DB | 登录页拖垮核心库 |
目标
- 单用户 / 单维度有明确冷却(如 60s 内不可重发)
- 全站不超过通道合同 QPS
- 校验路径轻量(Redis),异步记审计
推荐架构
客户端
▼
网关:图形验证码 / 行为风控(可选)
▼
业务 API:频控 + 生成码 → 写 Redis(TTL=5min)
▼
MQ(按通道分区)→ 多个 Sender Worker → 短信/邮件供应商
▼
校验:只读 Redis compare,成功则删码或标记已用
核心解法
1. 多维频控(Redis)
| 维度 | 示例 key | 规则 |
|---|
| 手机号 | sms:cd:{phone} | 60s 内 SET NX 失败则拒绝 |
| IP | sms:ip:{ip} | 每分钟 ≤ N 次 |
| 设备 | sms:did:{deviceId} | 每日 ≤ M 次 |
| 全站 | 令牌桶 / 滑动窗口 | 不超过通道 QPS |
发码前:依次检查 phone / ip / device / global
通过:SET sms:code:{phone} {code} EX 300
入队:topic=sms-send, key=phone(同号顺序消费)
2. 异步发送(削峰)
同步调供应商会占满 HTTP 线程;应 API 只入队即返回,Worker 按通道限速拉取。
- 分区 key =
phone % 通道数 或按供应商分 topic
- Worker 内 令牌桶 对齐合同 QPS
- 失败:退避重试 + 死信;不要无限重试同一条
3. 校验与防重放
- 校验成功:
DEL sms:code:{phone} 或 SET used 1(防二次使用)
- 登录态发放 token 与验证码解耦,避免「验证码表」高写
4. 降级
| 级别 | 行为 |
|---|
| 通道告警 | 只保留登录/支付类短信,关营销 |
| 全站过载 | 延长冷却、强制图形验证码 |
| 供应商故障 | 切换备用通道(多供应商路由) |
与秒杀 / 12306 的差异
| 维度 | 验证码洪峰 | 秒杀 |
|---|
| 一致性 | 频控必须准 | 库存必须准 |
| 失败语义 | 「请稍后再试」 | 「已售罄」 |
| 下游 | 第三方通道 | 自建 Redis/DB |
检查清单
相关