知识卡片

Transaction ID贯穿用户抢购生命周期,支撑与第三方的多方对账

普通读书笔记卡

内容

当交易的最后一步(真正的支付、扣款)发生在自己系统之外的第三方平台上时,自己系统里记录的”库存已扣减”和第三方那边真实发生的”用户是否真的完成了消费”之间天然存在脱节的风险——可能用户在第三方消费成功了,但通知回传失败;也可能用户抢到名额、跳转去了第三方页面,但压根没有真正付款,而自己系统这边的库存却已经被扣减了。抢购系统给出的应对方案是引入一个贯穿全流程的Transaction ID:从用户进入抢购业务的那一刻起生成这个唯一标识(案例中建议用发号器一类的能力来保证全局唯一性),用户在系统内的所有浏览、抢购等行为都挂靠在这个Transaction ID之下,直到用户跳转去第三方支付页面为止,这个跳转行为本身也会携带Transaction ID一并传递给第三方——最关键的是要完整记录下”用户获得商品名额后跳转去第三方”这个动作本身,这条记录构成了自己系统和第三方系统之间可以互相对照的锚点。有了这份Transaction Data记录,就可以按天(Daily Run)和第三方的真实消费数据做对账,比对双方各自统计的成交数量和金额,一旦发现不一致就能追溯到具体是哪些Transaction ID出现了问题,进而修复库存或账务上的偏差。这个案例给出的通用经验是:任何一个交易流程一旦跨越了自己不完全掌控的外部系统边界(这里是第三方支付),仅靠自己内部的状态记录是不足以保证数据最终正确的,必须在流程的关键跳转点埋下可追溯的唯一标识,并建立周期性的对账机制,把”发现不一致”和”修复不一致”这两件事都变成常规运作的一部分,而不是假设外部系统的通知一定准确、一定不会丢失。

参考来源

- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.3 秒杀系统架构解密与防刷设计"节,"3.3.5 如何与第三方多方对账"(源文件:_epub-src/OEBPS/Text/Chapter3_3_6.xhtml) - 结论依据:原文说明"Transaction ID 为用户维度的录,用户从进入抢购业务开始,产生一个Transaction ID……最主要的是需要记录下:用户获得商品名额后,跳转去第三方时的这一行为……我们构建的Transaction Data记录,就可以按照DailyRun的方式,与第三方对账,来fix两方数据库库存不一致等问题",直接支撑本卡片结论。 - 原始内容:Transaction ID 为用户维度的录,用户从进入抢购业务开始,产生一个Transaction ID……最主要的是需要记录下:用户获得商品名额后,跳转去第三方时的这一行为……我们构建的Transaction Data记录,就可以按照DailyRun的方式,与第三方对账,来fix两方数据库库存不一致等问题。