灰度三台实例同时上线,同一时间段三个不同手机号收到的验证码完全相同,都是 483921。日志显示启动时执行过 random.seed(42)。乍看像缓存或者权限的锅,追下去往往不是。

python -c "import random; random.seed(42); print([random.randint(100000,999999) for _ in range(3)])"
python -c "import secrets; print([secrets.randbelow(900000)+100000 for _ in range(3)])"

追下去是这么回事:种子固定后随机序列就固定了,进程重启或新实例启动都从同一位置开始。测试里为了可复现这么做没问题,代码复制到生产就变成可预测的验证码。

「随机数种子」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

具体做法是,生产代码删掉所有固定 seed 调用 改用 secrets 或 SecureRandom;加一条 CI 检查 禁止业务包出现 seed 常量;验证码做成一次性消费并限制失败次数;压测统计不同实例之间的重复率。

验收就看一点,两台实例各生成三个验证码 六个数互不相同 重复率为 0。

作者 9823189