snowflake算法(雪花算法)介绍
引用百科:雪花算法 (SnowFlake ) 算法,是 Twitter 开源的分布式 id 生成算法。
有这么一种说法,自然界中并不存在两片完全一样的雪花的。每一片雪花都拥有自己漂亮独特的形状、独一无二。雪花算法也表示生成的ID如雪花般独一无二。
其核心思想是,使用一个64 bit 的 ong 型的数字作为全局唯一 g。在分布式系统中的应用十分广泛,具D引入了时间戳,基本上保技自增的。
这 64 个 bit 中,其中1个 bit 是不用的(我们生成的 id 都是正数,所以第一个 bit 统一都是 ),然后用其中的 41 bit 作为毫秒数,用10bit 作为工作机器 id,12 bit 作为序列号。
按照上图理论:这个算法可以保证说,一个机房的一台机器上,在同一毫秒内,生成了一个唯一的 d。可能一个毫秒内会生成多个id,但是有最后12 个bt的序号来区分开来。
软件设计中的主键生成方案
- 数据库自增长ID
优 点 | 非常简单,有序递增,方便分页和排序。 |
缺 点 | 分库分表后,同一数据表的自增ID容易重复,无法直接使用(可以设置步长,但局限性很明显);性能吞吐量整个较低,如果设计一个单独的数据库来实现 分布式应用的数据唯一性,即使使用预生成方案,也会因为事务锁的问题,高并发场景容易出现单点瓶颈。 |
适用场景 | 单数据库实例的表ID(包含主从同步场景),部分按天计数的流水号等;分库分表场景、全系统唯一性ID场景不适用。 |
- Redis生成ID
优 点 | 整体吞吐量比数据库要高。 |
缺 点 | Redis实例或集群宕机后,找回最新的ID值有点困难。 |
适用场景 | 比较适合计数场景,如用户访问量,订单流水号(日期 流水号)等。 |
- UUID、GUID生成ID
优 点 | 不依赖任何数据源,自行计算,没有网络ID,速度超快,并且全球唯一。 |
缺 点 | 没有顺序性,并且比较长(128bit),作为数据库主键、索引会导致索引效率下降,空间占用较多。 |
适用场景 | 只要对存储空间没有苛刻要求的都能够适用,比如各种链路追踪、日志存储等。 |
- snowflake算法(雪花算法)生成ID
优 点 | 高性能、低延迟、去中心化、按时间有序 |
缺 点 | 要求机器时钟同步(到秒级即可) |
适用场景 | 分布式应用环境的数据主键 |
互联网大厂中的应用实践
ecp-uid项目
Leaf用来生成全局的唯一ID,其中的Leaf-snowflake方案是雪花算法的改进版。
Leaf概述
Leaf是基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家、数学家莱布尼茨的著名的一句话:“There are no two identical leaves in the world”(世间不可能存在两片相同的叶子)。
Leaf 也提供了两种ID生成的方式,分别是 Leaf-segment 数据库方案和 Leaf-snowflake 方案。
ecp-uid项目不但集成了现有的UidGenerator算法,原生的snowflake算法,还包含优秀的leaf segment算法
github:https://github.com/Meituan-Dianping/Leaf
uid-generator项目
UidGenerator项目基于snowflake原理实现,只是修改了机器ID部分的定义(实例重启的次数),并且64位bit的分配支持配置。
主要是先采用分批次获取ID