ENGINEERING NOTE 16 / 50 · SMS

短信事件如何去重而不丢失证据

OPEN RAMBO ·

轮询和回调可能反复返回同一短信。应对投递事件去重,同时保留排查重放所需元数据。

本文由 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.

如何验收

重复重放一个事件,再发送同单不同事件。重放只保留一条,新事件单独保留。

继续阅读