首页 > 技术文章 > 分布式uuid(全局唯一)

xiaowater 2018-08-22 16:43 原文

业务要求:
唯一性,时间相关,粗略有序,可反解,可制造
 
1: 建一个表,插入一条记录,获取其id(趋势有序, 非高并发,生成的ID中没有带Timestamp);
2:待含义前缀+时间+6位自然增长(带Timestamp,非趋势有序),利用分布式缓存的cas
3:java自带UUID
优势:
本地生成ID,不需要进行远程调用。
全局唯一不重复。
水平扩展能力非常好。
劣势:
ID有128 bits,占用的空间较大,需要存成字符串类型,索引效率极低。
生成的ID中没有带Timestamp,无法保证趋势递增
 
UUID由以下几部分的组合:
(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
(2)时钟序列
(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
 
UUID类型 version
基于时间的 UUID 1
DCE 安全 UUID 2
基于名称的 UUID 3
随机生成的 UUID 4
 
4: Twitter Snowflake
snowflake是twitter开源的分布式ID生成算法,其核心思想是:产生一个long型的ID,使用其中41bit作为毫秒数,10bit作为机器编号,12bit作为毫秒内序列号。这个算法单机每秒内理论上最多可以生成1000*(2^12)个,也就是大约400W的ID,完全能满足业务的需求。
问题:
需要引入zookeeper(强一致性)和独立的snowflake专用服务器
为了保持增长的趋势,要避免有些服务器的时间早,有些服务器的时间晚,需要控制好所有服务器的时间,而且要避免NTP时间服务器回拨服务器的时间。
在跨毫秒时,序列号总是归0,会使得序列号为0的ID比较多,导致生成的ID取模后不均匀,所以序列号不是每次都归0,而是归一个0到9的随机数。
 
4:批量生成,每一个client拿到一批,使用完后再调用(性能考虑,准连续)
 

推荐阅读