一、引言
在分布式系统中,生成全局唯一ID是一个常见的需求。传统的UUID(通用唯一识别码)虽然能够生成全局唯一的ID,但由于其无序性,在数据库插入数据时会导致频繁的页分裂,从而影响性能。雪花算法(Snowflake Algorithm)由Twitter开源,用于生成全局唯一的64位ID,具有高性能、有序性、可扩展性等特点。
二、雪花算法的整体设计
雪花算法生成的64位ID由以下几部分组成:
-
第一位(符号位):由于ID都是正整数,所以第一位始终为0。
-
时间戳(41位):记录时间戳的差值(相对于某个固定时间点),单位是毫秒。41位时间戳可以使用69年(从1970年开始,可用至2039年)。
-
工作机器id(10位):用于标识不同的工作机器(如不同的服务器实例),支持在同一数据中心内部署最多1024台机器。
如果存在跨机房部署的情况下可以把这10个bit位,拆分成两个5bit,前5个bit表示机房id,后面5个表示机器的id
-
序列号(12位):用于在同一毫秒内产生不同的ID,支持每个工作机器在同一毫秒内产生最多4096个ID。
三、实现方式
1. 初始化参数
在启动服务时,需要为每个工作机器分配一个唯一的工作机器id和一个数据中心id。这些id通常在服务配置中指定,并且在整个服务运行期间保持不变。
2. 生成时间戳
每次生成ID时,首先获取当前时间戳(毫秒级),并计算其与起始时间戳的差值。起始时间戳是一个固定的时间点,通常设置为服务的启动时间或某个固定的时间点。
3. 分配工作机器id和数据中心id
根据服务的配置,将工作机器id和数据中心id分别放入ID的相应位置。这些id在初始化时分配,并在整个服务运行期间保持不变。
4. 生成序列号
在同一毫秒内,如果多次调用生成ID的方法,需