验证码与通知洪峰

返回 高并发

登录、注册、找回密码、营销推送在活动开始或故障恢复时会产生「短信 / 邮件 / 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 失败则拒绝
IPsms: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

检查清单

  • 发码与校验是否分离?校验是否避免同步调供应商?
  • 手机号 / IP / 设备 / 全站是否都有上限?
  • 是否 MQ 异步发送 + Worker 限速?
  • 码是否一次性、带 TTL?
  • 是否有通道降级与多供应商?

相关