初始模型:

会员表里本身有 expire_time,每天定时找出“7 天后到期”的会员,然后触发通知即可。

  • 过期时间索引:5000 万会员不能每天全表扫 → expire_time 建索引,只查目标时间范围
  • 定时扫描:提前 7 天不要求秒级准确 → 每天跑一次任务,查询 7 天后即将到期的会员
  • 分批处理:当天待通知人数可能很多 → 分页/分片查出,分批投递
  • MQ 异步通知:通知服务可能处理不过来 → 先写 MQ,消费者按能力慢慢发送
  • 并行消费:短信、Push、站内信量大 → 多个消费者并行处理,提高吞吐
  • 幂等:定时任务重跑、消息重试可能导致重复提醒 → 按用户 + 到期时间 + 通知类型做唯一控制
  • 失败重试:通知渠道可能调用失败 → 失败重试,超过阈值进死信/异常队列
  • 发送前校验:用户可能已经续费或状态变化 → 真正发送前再检查一次当前会员状态,避免误发
  • 通知内容优化:大量用户通知内容相同 → 站内信可用模板 + 用户关系,不必重复存整份正文

最后主线就是:

expire_time 建索引 → 每天查 7 天后到期用户 → 分批进 MQ → 并行通知 → 幂等 + 重试 → 发送前再校验。