@HUST-SuWB
2020-05-10T06:23:47.000000Z
字数 2206
阅读 506
美团
关键词:
UUID全称为:Universally Unique IDentifier(通用唯一识别码),其算法的目的是为了生成某种形式的全局唯一ID来标识系统中的任一元素,尤其在分布式环境下可不依赖中心认证即可自动生成全局唯一ID。UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为 8-4-4-4-12 的32个字符。
目前分5个版本:
版本1的UUID的组成为: "-" "-" "-" "-" ,其中
Name | Content |
---|---|
time_low | 整数:低位 32 bits 时间 |
time_mid | 整数:中间位 16 bits 时间 |
time_high_and_version | 最高有效位中的 4 bits“版本”,后面是高 12 bits 的时间 |
variant_and_sequence | 最高有效位为 1-3 bits“变体“,后跟13-15 bits 时钟序列 |
node | 48 bits 节点 ID |
数据库自增ID是最容易想到的方案,每次插入数据库自增1,就能获得全局有序且连续且绝对不会重复的id,非常完美,但是缺点也同样明显,可用性和性能都有瓶颈。因此实际场景下一般会有一些优化策略,这些优化策略总结起来无外乎以下两种:
但以上两个方案也都有自己的问题。水平扩展后的数据库集群性能瓶颈也不会太高,而且id没有了全局有序的特性,并且以后再要扩展也会很麻烦。批量生成N个id的方案如果服务器重启,会造成很多的id缺口没有使用,同时依然有单点的性能瓶颈。
基于一个成熟的分布式组件来实现自增id,如Redis和Zookeeper:
基于Redis的方案可以实现较好的性能,但是由于Redis的AP特性,可能出现不一致。而基于Zookeeper的方案虽然可以实现强一致性,但是可用性又会有瓶颈。
Snowflake,即雪花算法应该是最知名的一个分布式id生成算法了。
雪花算法生成id的结果是一个64bit大小的整数:
雪花算法有很多优点:性能好,可用性高,id按时间递增,只要不出现时钟回拨则整个集群都不会有重复id。还可以修改64bit中各个部分的长度,实现高度的业务定制化。
方案 | 优点 | 缺点 |
---|---|---|
UUID | 生成简单,性能好,重复率很低,本地生成 | 可读性差,无序,有安全风险 |
数据库 | 绝对不会重复,有序 | 强依赖数据库,容易出现单点。有性能瓶颈 |
分布式组件 | 性能好,有序 | 依赖分布式集群,增加系统复杂度,降低可用性 |
Snowflake | 性能好,可用性高,有序 | 强依赖本地时钟,一旦出现时钟回拨就会有很大的风险 |
Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家、数学家莱布尼茨的一句话:“There are no two identical leaves in the world.”Leaf具备高可靠、低延迟、全局唯一等特点。目前已经广泛应用于美团金融、美团外卖、美团酒旅等多个部门。
特性: