分布式ID特性:
- 趋势有序性(作为数据库主键时,顺序IO相较随机IO更友好)
- 较UUID更短(占用更小的存储,只占64bit)
- 其它(略)
64bit构成:
时间偏移(42bit) | 数据中心ID(5bit) | 节点ID(5bit) | 序号(12bit)
可按需自定义调整某部分的bit长度,比如把节点ID改为 3 bit
- 时间偏移:当前时间 - 初始时间
- 数据中心:用于多中心场景
- 节点ID:用于分布式场景,如准备3个节点构成集群来生成分布式ID, 那么这三个节点的配置文件中,节点ID一定不要重复,如分别为1、2、3
- 序号:用于毫秒级并发时,自增序号
源码
https://github.com/xuezhongde/id-generator
func (gen *Generator) NextId() (int64, error) {
currentTimestamp := currentTimeMillis()
if currentTimestamp < gen.lastTimestamp {
return -1, errors.New("Clock moved backwards. Refusing to generate id")
}
gen.lck.Lock()
if currentTimestamp == gen.lastTimestamp {
gen.sequence = (gen.sequence + 1) & gen.maxSequence
//同一毫秒的序列数已经达到最大
if gen.sequence == 0 {
currentTimestamp = gen.getNextTimestamp()
}
} else {
gen.sequence = 0
}
gen.lastTimestamp = currentTimestamp
gen.lck.Unlock()
return (currentTimestamp-gen.StartTimestamp)<<gen.timestampShift | gen.DataCenterId<<gen.dataCenterShift | gen.WorkerId<<gen.workerShift | gen.sequence, nil
}
测试
git clone 下源码后,启动服务,访问地址:http://localhost:8080/id/next
配置文件
参见源码中的 /etc/id.toml
注意事项
标签:SnowFlake,sequence,id,gen,ID,currentTimestamp,Go,节点 From: https://blog.csdn.net/qq_43083126/article/details/139578323服务器网络时间同步一致,注意时间回拨问题