天天看点

常见分布式ID生成策略总结

分布式ID需求

1.全局唯一:不能出现重复ID

2.高可用:ID生成系统是基础系统,被许多关键系统调用,一旦宕机,就会造成严重影响。

1.Java 的UUID方案

它是在一定的范围内(从特定的名字空间到全局),唯一的机器生成的标识符,所以UUID在其他语言中也叫做GUID。

UUID是经由一定的算法机器生成的,为了保证UUID的唯一性,规范定义了包含网卡,MAC地址,时间戳,名字空间(nameSpace)、随机或伪随机数,时序等元素,以及从这些元素生成UUID的算法。UUID只能由计算机生成。

一个UUID是16字节长的数字,一共128位。转换成字符串后,它会变成一个36字节的字符串。使用的时候可以把中间的-分隔符给去掉,剩下32字节的字符串。

优点:

UUID的优点是本地生成ID,不需要进行远程调用,时效好,性能高。

缺点:

16字节共128位,通常以36字节长的字符串来表示,在很多应用场景不适应。UUID没有统一的排序,无法保证趋势递增,因此用于数据库索引字段的效率很低,添加记录存储入库性能差。

对于高并发和大数据量的系统,不建议使用UUID。

2.分布式缓存Redis生成ID:

利用reids的原子操作INCR和INCRBY,生成全局唯一的ID。

3.zookeeper临时顺序节点ID生成器

利用zookeeper的顺序节点,生成全局唯一的ID。

4.推特的SnowFlake算法

snowFlag算法是一种著名的分布式服务器用户ID生成算法。SnowFlake算法所生成的DI是一个64bit的长整形数字,这64bit被划分成了4个部分,其中后面三个部分分别别表示时间戳,工作机器ID,序列号。

SnowFlakeID的四个部分,具体介绍如下:

(1)第一个位 占用1bit,其值始终是0,没有实际作用

(2)时间戳 占用41bit,精确到毫秒,总共可以容纳约69年的时间。

(3)工作机器ID 占用10bit,最多可以容纳1024个节点

(4)序列号 占用12 bit,最多可以累加到4095.这个值在痛一毫秒同一节点上从0开始不断累加。

总体来说,在工作节点达到1024顶配的场景下,SnowFlake算法在同一毫秒内最多可以生成ID大致为:1024 * 4096 =4194304 ,总计400多万个ID,也就是说,在绝大多数并发场景下是够用的。

SnowFlake算法的优缺点:

优点:

1.生成ID时不依赖于数据库,完全在内存生成,高性能和高可用。

2.容量大,每秒可以生成几百万个ID

3.ID呈现趋势递增,后续插入数据库的所引述时,性能较高。

缺点:

1.依赖于系统时钟的一致性,如果某台机器的系统时钟回拨了,有可能造成ID冲突,或者ID乱序。

2.启动之前,如果这台机器的系统时间回拨过,那么有可能出现ID重复的危险。

5.MongoDB的ObjectID

Mongodb是一个分布式的非结构化NoSQL数据库,每插入一条记录会自动生成全局唯一的一个“_id”字段值,它是一个12字节的字符串,可以作为分布式系统中的全局唯一ID。

继续阅读