问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

订单全局唯一ID设计方案

创作时间:
作者:
@小白创作中心

订单全局唯一ID设计方案

引用
CSDN
1.
https://blog.csdn.net/CSDN_SAVIOR/article/details/141279168

在高并发交易系统中,如何保证订单号的全局唯一性是一个重要的技术挑战。本文提出了一种基于TDDL的订单全局唯一ID设计方案,通过合理的结构设计和高效的序列生成机制,成功解决了这一问题。

背景

交易系统最重要的就是收单,庞大的订单量如何保证订单号唯一,成为了目前我们要解决的问题。

问题点

  1. 订单号全局唯一
  2. 订单号趋势递增
  3. 订单号生成的可用性
  4. 订单号的特点

设计

设定订单号由19位组成:
2(订单标识符)+13(唯一序列)+4(用户ID)

订单标识符

  1. 订单标识符的作用主要用于区分订单类型。
  2. 在进行新旧系统切流的时候,也可以用于流量染色。

唯一序列

  1. 唯一序列只要保证唯一,订单号就不会重复。
  2. 唯一序列保证趋势递增,这个订单号就会趋势递增,因为订单标识符是固定的。
  3. 13位的唯一序列,可以有5万亿的组成方式,可用性比较高。

用户ID

用户ID主要用于分库分表的策略,如果是B端系统,不会向C端交易系统一样实时查订单列表数据,可以直接根据订单号取模即可。

方案

这里给出TDDL生成唯一序列的方案。
TDDL提供了基础的分库分表、读写分离和全局唯一序列的功能。
分库分表和读写分离的功能基本和sharding-jdbc的原理一样,会在代码层级做逻辑分片。

针对于全局唯一序列的功能,TDDL在本地启动的时候,会初始化一个指定步长(默认1000)的容器,数据会从TDDL的服务端拉取过来,存到本地。本地需要序列号,直接在本地内存中取即可。相对来说保证了获取序列号时的效率。至于序列号的唯一性由TDDL能力提供。
TDDL服务端会维护一个数据库,每次去数据库拉取序列号的时候,会通过Auto-increment Lock来保证序列号自增和唯一性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号