龙空技术网

分布式架构设计之分布式ID生成方案,看淘宝订单号生成规则

coderTT 1071

前言:

现在你们对“物品id生成算法”大概比较关注,兄弟们都需要知道一些“物品id生成算法”的相关资讯。那么小编在网络上收集了一些对于“物品id生成算法””的相关文章,希望咱们能喜欢,咱们快快来了解一下吧!

上一篇文章梳理了分布式系统设计几个核心原则,其中谈到分库分表,实践中肯定涉及到唯一ID的使用和生成问题,比如订单ID、交易ID等。本文主要讲述分布式ID设计要考虑的因素及主流的实现方案,同时也会讲淘宝订单ID是如何生成的。

为什么要使用分布式ID

单体数据库,我们一般使用自增字段生成唯一ID就够了,当我们数据量达到一定程度,需要分库分表来缓解数据库的压力时,就需要外部生成唯一ID。

分布式ID设计关注的特性:

唯一性高性能安全性,防止遍历数据结合业务属性编码,如可按生成时间排序、分库表路由分布式ID生成方案

1 - UUID

UUID(Universally Unique Identifier)是包含32个16进制数字,以连字号分为五段,示例:000e8400-c29b-41d4-be16-116655220000。

优点:全局唯一、去中心化稳定性高、服务器本地生成效率高

缺点:字符串长度太长存储空间大、非数字索引效率低、不能排序

2 - 雪花算法

SnowFlake算法是Twitter公司推出的专门针对分布式ID的解决方案。结构:符号位+时间戳+工作进程位+序列号位,一个64bit的整数,正好为一个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会失败。

针对雪花算法的问题,国内也有开源方案

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

3 - 自定义生成算法

会根据业务需求自定义生成分布式ID,比如淘宝订单号,如:2996940718765557337,由19位组成的数字,后6位是买家ID的头尾3位组成,前13位是业务标识+时间戳生成,前13位是确保可以排序,后6位则用于分库分表的路由字段,通过后6位hash后,可以知道当前用户的订单数据在哪个库哪张表。同时,用买家ID做路由字段,可以避免数据倾斜。

标签: #物品id生成算法