分布式系统下为不同的数据节点生成全局唯一主键
要求
基本要求:
- 全局唯一
- 高性能:生成要快
- 高可用:生成分布式ID的服务要保证可用性
- 方便易用
额外:
- 安全:不含敏感信息
- 有序递增
- 有具体的业务含义
- 独立部署:单独有一个发号器服务
常见解决方案
数据库号段
CREATE TABLE `sequence_id_generator` (
`id` int(10) NOT NULL,
`current_max_id` bigint(20) NOT NULL COMMENT '当前最大id',
`step` int(10) NOT NULL COMMENT '号段的长度',
`version` int(20) NOT NULL COMMENT '版本号',
`biz_type` int(20) NOT NULL COMMENT '业务类型',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
version
字段主要用于乐观锁
- 创建一个数据库表
squence_id_generator
,存储当前最大长度、号段的长度 - 每一次申请一块的ID,放入内存,需要用的时候从内存中拿
- 更新数据库表
NoSQL
- 使用Redis Cluster
- MongoDB
算法
UUID
//cb4a9ede-fa5e-4585-b9bb-d60bce986eaa
UUID.randomUUID()
不同版本的UUID的生成规则不同
可以保证全局唯一性,但是过长、无顺序
Snowflake
- sign(1 bit):符号位,始终为0,代表ID为正数
- timestamp(41 bit):毫秒为单位的时间戳,可以支撑
毫秒 - datacenter id + worker id(10 bits):机房ID+机器ID
- sequence(12 bits):单台机器每毫秒所能生成的最大ID数(
),自增的序列号