雪花算法中非常好用的数字ID生成器
💎 最佳实践(置顶)
针对大家在测试过程中,经常出现的性能问题,以下给出3组最佳实践配置:
总之,增加 SeqBitLength 会让性能更高,但生成的 ID 也会更长。
💎 算法介绍
需求来源
传统算法问题
新算法特点
性能数据
(参数:10位自增序列,1000次漂移最大值)
连续请求量 | 5K | 5W | 50W |
---|---|---|---|
传统雪花算法 | 0.0045s | 0.053s | 0.556s |
雪花漂移算法 | 0.0015s | 0.012s | 0.113s |
如何处理时间回拨
💎 ID组成说明
- 本算法生成的ID由3部分组成(沿用雪花算法定义):
- +-------------------------+--------------+----------+
- | 1.相对基础时间的时间差 | 2.WorkerId | 3.序列数 |
- +-------------------------+--------------+----------+
- 第1部分,时间差,是生成ID时的系统时间减去 BaseTime 的总时间差(毫秒单位)。
- 第2部分,WorkerId,是区分不同机器或不同应用的唯一ID,最大值由 WorkerIdBitLength(默认6)限定。
- 第3部分,序列数,是每毫秒下的序列数,由参数中的 SeqBitLength(默认6)限定。
ID示例
🟣 本算法生成的 ID ,是整数(占用空间最多8字节),以下是基于默认配置生成的ID:
129053495681099 (运行1年,长度:15)
387750301904971 (运行3年,长度:15)
646093214093387 (运行5年,长度:15)
1292658282840139 (运行10年,长度:16)
9007199254740992 (运行70年,达到 js Number 最大值,长度:16)
165399880288699493 (运行1000年,等同普通雪花算法运行1年,长度:18)
🟣 本算法生成的 ID 值,是 js Number 最大值的 1%-10%,是普通雪花算法值的千分之一,而生成速度却超过普通雪花算法。
🟣 js Number 类型最大数值:9007199254740992,本算法在保持并发性能(5W+/0.01s)和最大64个 WorkerId(6bit)的同时,能用70年才到 js Number Max 值。
长度估算
💍 每增加 1位 WorkerIdBitLength 或 SeqBitLength,生成的ID数字值将会乘以2(基础长度可参考前一节“ID示例”),反之则除以2。
能用多久
能用多久的解释,是指生成的ID数字,何时能增长到超过 long(有符号64位,8字节)最大值。
💎 参数设置
特别提示:如果一台服务器部署多个独立服务,需要为每个服务指定不同的 WorkerId。
第二版计划增加参数:
常规集成
配置变更
配置变更是指系统运行一段时间后,再调整运行参数(IdGeneratorOptions 对象属性),请注意:
自动注册WorkerId
自动注册流程图
图片链接:https://github.com/yitter/IdGenerator/blob/master/Tools/AutoRegisterWorkerId/regprocess.jpg
源码路径:/Go/source/regworkerid/reghelper.go
动态库下载
下载链接1:https://github.com/yitter/IdGenerator/releases/download/v1.3.3/workeridgo_lib_v1.3.3.zip
动态库接口定义
// 注册一个 WorkerId,会先注销所有本机已注册的记录
// address: Redis连接地址,单机模式示例:127.0.0.1:6379,哨兵/集群模式示例:127.0.0.1:26380,127.0.0.1:26381,127.0.0.1:26382
// password: Redis连接密码
// db: Redis指定存储库,示例:1
// sentinelMasterName: Redis 哨兵模式下的服务名称,示例:mymaster,非哨兵模式传入空字符串即可
// minWorkerId: WorkerId 最小值,示例:30
// maxWorkerId: WorkerId 最大值,示例:63
// lifeTimeSeconds: WorkerId缓存时长(秒,3的倍数),推荐值15
extern GoInt32 RegisterOne(char* server, char* password, GoInt32 db, char* sentinelMasterName, GoInt32 minWorkerId, GoInt32 maxWorkerId, GoInt32 lifeTimeSeconds);
// 注销本机已注册的 WorkerId
extern void UnRegister();
已实现的语言
语言 | github |
---|---|
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
|
查看示例 |
技术支持
开源地址:https://github.com/yitter/IdGenerator
QQ群:646049993