美文网首页支付分享
支付系统ID的设计

支付系统ID的设计

作者: 绿皮多驱小火车 | 来源:发表于2017-12-13 08:19 被阅读84次

    本文主要的内容是,在构建支付系统时,涉及到的各种ID、NO、凭证号的生成规范,对应的关键思考点,以及实现方案。

    需要将ID分类

    ID的生成分为3类:凭证号、普通ID、自增ID。

    凭证号

    支付系统中,一部分ID需要作为凭证号存在,支付整体来看,具有一定的业务意义。需要区分开来。

    自增ID

    完全不需要对外,无业务意义,为了性能和有序性而存在。

    设计目标:
    • 局部唯一
    • 局部有序
    • 性能好
    • 不作为分库分表的依据
    • 具体ID生成策略:
    • 数据库物理主键。
      +1自增长,建议每个表都增加。

    普通ID

    系统内部ID,没有整体支付的业务意义。

    设计目标
    • 全局唯一
    • 趋势递增
    • 分段可配
    • 可读性
    • 可作为分库分表依据
    • 性能有保证
    • 具体ID生成策略

    凭证号25位字符串,组成规则如下:

    时间戳(8位)+递增序列(12位)+分库分表标识位(5位)

    redis自增的实现

    redis自增:借助redis单线程通过incr、incrby实现唯一自增id。
    redis自增1方式
    redis> SET rank >> 0 OK
    redis> INCR rank >> (integer) 1
    redis> GET rank >> "1"

    说明:内部自增,每次+1即可。
    递增序列到了最大值(不一定非要到物理最大值,可以预留一个缓冲段)后,执行SET rank,进行重置(0)。
    

    凭证号

    系统内部ID,从支付全区来看,是连接业务的锁链。(逻辑上,有点像外健)
    普通ID、自增ID,直接通过ID生成器获取,而凭证号需要在凭证服务(Voucher)落地处理。

    设计目标
    • 全局唯一
    • 趋势递增
    • 分段可配
    • 可读性
    • 可作为分库分表依据
    • 性能有保证
    • 具有整体业务意义
    凭证号有哪些?

    目前的需求来看,以下3类数据,需要通过Voucher获取凭证号作为ID的有如下几个:

    1. 交易凭证号
    2. 支付凭证号
    3. 入账凭证号
    原始凭证(外壳)

    除此之外,每次请求的通用信息(如调用的接口、合作方ID、字符集、签名、签名类型、买家IP、操作员、回调地址等),这也将作为每次资金变动的原始凭证的一部分而存在。

    ID生成策略

    redis自增:借助redis单线程通过incr、incrby实现唯一自增id
    

    分段配置
    凭证号29位字符串,组成规则如下:

    业务代码(3位)+时间戳(8位)+递增序列(12位)+有效性校验码(1位)+分库分表标识位(5位)

    业务代码

    301-支付,302-退款;
    401-提现,402-退票
    501-转账
    601-充值,602-充退
    701-资金冻结,702-资金解冻

    时间戳
    YYYYMMDD
    递增序列
    12位,+1递增,全局有序。
    有效性校验码
    1位
    校验规则(不能太耗CPU,但也不能太容易猜出):
    通过Luhn算法生成校验码 http://www.jianshu.com/p/193d8b84a6a1
    服务间关系

    系统间关系

    其他

    UUID:UUID无法保证趋势递增、不可读,不可以接受。

    相关文章

      网友评论

        本文标题:支付系统ID的设计

        本文链接:https://www.haomeiwen.com/subject/feooixtx.html