本文主要讲清楚支付系统订单号(或业务ID)各种设计方案对比,各子域的订单号(或业务ID)为什么要统一规范,以及最佳实践。最后还会简单分析微信支付和支付宝的对客订单号的组成差异。
假如你也好奇为什么有了数据库自增ID外还需要业务ID,或者想了解如何在业务ID中编织进业务信息比如业务系统,数据版本,分库分表位等,值得花几分钟了解一下。
同时我也不建议在支付系统中使用雪花算法来生成业务ID。
订单号和业务ID本质都是标识一笔交易,以下统称为:业务ID。
一、什么是业务ID
数据库一般都会设计一个自增ID做为主键,同时还会设计一个能唯一标识一笔业务的ID,这就是所谓的业务ID(也称业务键)。比如收单域有收单单号,支付域有支付号,渠道网关域有渠道支付号等,这些都属于业务ID。
为什么有了自增ID后,还需要有业务ID呢?一般来说有以下几个核心原因:
- 分库分表的强诉求。一旦分库分表,各表之间的自增ID就一定会重复。
- 全球化部署的强诉求。在跨境支付系统建设时,部分国家地区要求本地化部署,需要通过业务ID知道业务运行在哪个机房。
- 标识业务语义,在处理故障时能快速定位是哪个域哪个业务。
- 方便系统升级。通过业务ID的版本所在位判断业务应该走