[关闭]
@HUST-SuWB 2020-05-10T06:23:47.000000Z 字数 2206 阅读 506

分布式ID生成器

美团


分布式id生成器

关键词:

主流业界方案

UUID

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

数据库自增ID是最容易想到的方案,每次插入数据库自增1,就能获得全局有序且连续且绝对不会重复的id,非常完美,但是缺点也同样明显,可用性和性能都有瓶颈。因此实际场景下一般会有一些优化策略,这些优化策略总结起来无外乎以下两种:

但以上两个方案也都有自己的问题。水平扩展后的数据库集群性能瓶颈也不会太高,而且id没有了全局有序的特性,并且以后再要扩展也会很麻烦。批量生成N个id的方案如果服务器重启,会造成很多的id缺口没有使用,同时依然有单点的性能瓶颈。

分布式组件

基于一个成熟的分布式组件来实现自增id,如Redis和Zookeeper:

基于Redis的方案可以实现较好的性能,但是由于Redis的AP特性,可能出现不一致。而基于Zookeeper的方案虽然可以实现强一致性,但是可用性又会有瓶颈。

Snowflake

Snowflake,即雪花算法应该是最知名的一个分布式id生成算法了。
雪花算法生成id的结果是一个64bit大小的整数:

雪花算法有很多优点:性能好,可用性高,id按时间递增,只要不出现时钟回拨则整个集群都不会有重复id。还可以修改64bit中各个部分的长度,实现高度的业务定制化。

对比

方案 优点 缺点
UUID 生成简单,性能好,重复率很低,本地生成 可读性差,无序,有安全风险
数据库 绝对不会重复,有序 强依赖数据库,容易出现单点。有性能瓶颈
分布式组件 性能好,有序 依赖分布式集群,增加系统复杂度,降低可用性
Snowflake 性能好,可用性高,有序 强依赖本地时钟,一旦出现时钟回拨就会有很大的风险

Leaf

Leaf是美团基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家、数学家莱布尼茨的一句话:“There are no two identical leaves in the world.”Leaf具备高可靠、低延迟、全局唯一等特点。目前已经广泛应用于美团金融、美团外卖、美团酒旅等多个部门。

特性:

发展历程

初始版本

双Buffer优化

动态调整Step

Snowflake

源码解析&使用姿势

Leaf

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注