淘宝订单编号,网购交易编码?

在前一篇文章中,我们介绍了分布式系统设计的几个核心原则,其中提到了分库分表。在实践中,分库分表必然涉及到唯一ID的使用和生成问题,比如订单ID、交易ID等。本文将主要探讨分布式ID设计时需要考虑的因素以及主流的实现方案,同时也会介绍淘宝订单ID的生成方法。

为什么要使用分布式ID

在单体数据库中,我们通常使用自增字段来生成唯一ID。然而,当数据量逐渐增加,需要将数据库进行分库分表来减轻压力时,就需要用外部方式生成唯一ID。

1. 全局唯一性:分布式ID需要保证每个生成的ID在全局范围内是唯一的,避免重复的情况发生。

2. 可排序:生成的ID需要能够按照一定规则进行排序,方便应用在分布式系统中的排序操作。

3. 可适应高并发:在高并发的场景下,分布式ID的生成不能成为系统的性能瓶颈,需要能够支持大规模并发请求。

4. 高可用性:分布式ID生成方案需要保证在系统出现故障或部分节点不可用的情况下,仍然能够正常生成唯一ID。

  1. 唯一性
  2. 高性能
  3. 安全性,防止遍历数据
  4. 结合业务属性编码,如可按生成时间排序、分库表路由

分布式ID生成方案

1 – UUID

UUID(通用唯一标识符)是一个由32个十六进制数字组成的标识符,它被分为五段,其中包含连字符,例如:000e8400-c29b-41d4-be16-116655220000。

优点:全局唯一、去中心化稳定性高、服务器本地生成效率高。这三点特性使得这项技术在实际应用中具有很大的优势。

缺点:字符串长度过长会占用较大的存储空间、非数字索引的效率较低、不支持排序。

2 – 雪花算法

SnowFlake算法是一种专门针对分布式ID生成的解决方案,由Twitter公司推出。该算法采用了64位的整数结构,包括符号位、时间戳、工作进程位和序列号位,可以被存储为长整型(long)数据类型,适合在Mysql中以bigint类型进行存储。

淘宝订单编号,网购交易编码?

  • 从左到右,第一位为符号位,0表示正,1表示负。
  • 时间戳:2^41/(365 * 24 * 60 * 60 * 1000)=69.73年。可表示的范围为69年(从1970年开始),可以用到2039年。
  • 10bit工作位是5位数据中心ID和5位工作ID,其中5位的数据中心ID和5位工作ID的范围是:0到2^5 -1=31,分布式环境中一般都是通过设置不同的数据中心ID和工作ID来确保生成的ID不会重复。
  • 12bit-序列号表示每个机房的每个机器每毫秒可以产生2^12-1(4095)个不同的ID序号

优点:独一无二、无需外部支持、生成数字结果、便于存储和提高索引效率、可按顺序排列

这种ID生成系统的一个缺点是依赖系统时间戳,生成新ID时需要获取的时间戳必须大于上次生成的时间戳,否则会出现错误。因此,在集群中,服务器必须进行时间同步,以防止出现时间回拨而导致生成ID的失败。

国内也有一些针对雪花算法的开源方案。

  • 百度UidGenerator:采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 单机QPS可达600万。
  • 美团Leaf:提高了对时间回拨的容忍性,如果时间回拨小于2秒,生成ID会等待。

3 – 自定义生成算法

根据业务需求自定义生成分布式ID对于诸如淘宝订单号的生成能够发挥重要作用。淘宝订单号一般都由19位数字组成,其中后6位由买家ID的头尾3位组成,前13位包含业务标识和时间戳信息,以确保按顺序排列。前13位也被用作分库分表的路由字段,而后6位则用于特定的分库分表算法以确定数据在哪张表中。使用买家ID作为路由字段可以有效避免数据倾斜。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 sumchina520@foxmail.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.summeng.com/64436.html