分布式ID
约束
-
全局唯一:必须保证ID是全局性唯一的,基本要求
-
高性能:高可用低延时,ID生成响应要快
-
高可用:多系统以来,要求尽可能高的可用性
-
易用性:业务系统改造少
-
趋势递增:不同场景有不同要求,有些场景希望有序,有些希望无序
方案
UUID
-
实现简单,本地生成,唯一
-
无序、过长、无业务含义
数据库方案
自增ID
-
实现简单,单调自增
-
数据库瓶颈
自增ID+数据库集群
-
简单的主从容易重复
-
多主扩容麻烦,数据库也是瓶颈
号段模式
-
一次获取一定范围的ID,数据库压力较小
-
趋势递增
-
解决毛刺问题: 双buffer
redis存储
-
用incr实现自增ID,性能较高
-
持久化存在ID重复(rdb来不及备份)或恢复慢(aof中incr指令过多)
snowflake
-
0(1bit)+根据时间戳(41bit)+节点ID(10bit)+内置序列号生成的序列号(12bit)
-
可以本地生成或者结合号段模式,性能高,依赖小
优化
-
snowflake workerId 分配
-
防止自身节点时钟回拨
-
防止节点自身时钟不正确