ENGINEERING NOTE 16 / 50 · SMS
短信事件如何去重而不丢失证据
轮询和回调可能反复返回同一短信。应对投递事件去重,同时保留排查重放所需元数据。
本文由 OPEN RAMBO 发布。工程方案和伪代码用于说明设计,不是现有产品 API 文档;示例数字均为演示。
选择正确事件标识
优先使用原订单与供应商范围内的消息编号。没有时,使用稳定字段的带密钥摘要,不要直接散列短验证码;短码空间小,普通散列无法保护。
区分重放与新消息
同一订单可能合法收到第二条消息,不能只用订单号作消息去重键。保留接收时间与序列元数据,正文遵循最少留存。一个事件不应触发多次成功通知。
结算单独幂等
消息去重不能代替资金幂等。重复投递不得再扣款,新消息也不应自动创建新付费订单。每个业务动作都应关联原订单约定。
示意流程
unique_key = (provider_id, order_id, message_id)
insert_event_if_absent(unique_key)
# Never use a raw OTP as an analytics identifier.如何验收
重复重放一个事件,再发送同单不同事件。重放只保留一条,新事件单独保留。