SELECT carrier, count(*) total, sum(status='delivered') ok FROM sms_log WHERE created_at > now() - interval '1 day' GROUP BY carrier;
后台统计注册验证码发送 1 万条,用户实际提交 7200 条,移动号段失败率明显高于联通。通道回执里大量是 undeliverable,没有具体原因码。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,只接了一家通道,覆盖的号段有限,部分运营商路由被拦。失败回执没有细分状态,代码把所有非 success 都当同一类,重试也没换通道。用户端只看到收不到,没有兜底。
这次卡住的地方就在「验证码到达率」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。
处理上按这个顺序:按运营商统计到达率 找出失败集中的号段;接入第二家通道 按号段分流发送;失败后换通道重试一次 间隔 30 秒;给用户保留语音验证码入口 作为最后兜底。
改完只确认一件事:分运营商到达率都到 90% 以上,换通道重试的补救成功率达到 60%,用户投诉量下降一半。
