Snowflake

ID生成器在前后端系统内都比较常见,应用场景广泛,如:订单ID、账户ID 、流水号、消息ID等等。常见的ID类型如下:

• UUID和GUID:GUID和UUID本质类似,GUID来源于微软。一个UUID是一个16字节 (128 bit) 的数字。UUID由网卡MAC地址、时间戳、名字空间 ( Namespace )、随机或伪随机数、时序等元素进行生成。优点:在特定范围内可以保证全局唯一;生成方便,单机管理即可。缺点:所占空间比较大;无序,在插入数据库时可能会引起大规模数据位置变动,性能不友好。

• 数据库自增ID:主要基于关系数据库如MySQL的autoincrement自增键,在业务量不是很大时使用比较方便。基于数据库自增字段也有一些变种,如下面会介绍到的号段模式。优点:实现成本低,直接基于DB实现,不需要引入额外组件;能够实现单调自增,递增场景友好。缺点:需要考虑高可用、横向扩展问题。

• snowflake :雪花算法由毫秒时间戳(41位) + 机器ID(workerId 10位) + 自增序列 (12位),理论上最多支持1024台机器每秒生产400w个ID。雪花算法综合考虑了性能、全局唯一、趋势自增、可用性等,是一种非常理想的ID生成算法。

snowflake是Twitter于2010年首次对外公开,其值为64位整数,可以做到全局唯一。构造如下:

雪花算法,什么情况下发生 ID 冲突? - InfoQ 写作平台