V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  wowowo1  ›  全部回复第 2 页 / 共 2 页
回复总数  21
1  2  
2017-11-20 02:49:50 +08:00
回复了 owenliang 创建的主题 Go 编程语言 昨晚用 Golang 写了个 ID 生成服务,分享给大家
看了下代码,仿佛核心是先分区( segments ),仿佛也可称为分片,然后根据每个分片根据自己的分区信息自己内部进行 ID 递增。


```
func (alloc *Alloc)NextId() (int64, error) {
alloc.mutex.Lock()
defer alloc.mutex.Unlock()

if len(alloc.segments) > 0 {
id := alloc.segments[0].left + alloc.segments[0].offset
alloc.segments[0].offset++
if id + 1 >= alloc.segments[0].right {
alloc.segments = append(alloc.segments[:0], alloc.segments[1:]...)
}
return id, nil
} else {
return 0, errors.New("no more id")
}
}
```

套用日本中二片里面自吹的话,最简单是 ID 生成器,最难也是 ID 生成器。

如果我理解没错的话,
你这套代码只能保证某个分区内递增,不能保证所有分区一起递增。
每次请求不能落盘,不能记录已分配的 ID,或许可以采用异步解决,但是遇到灾难性故障基本会出现重复的情况。
64 位整形仍然不能保证不重复。

目前来看,UUID 中 snowflake 才是终极方案,自增 ID 仍然数 TIDB 那套比较靠谱,虽然他不能保证连续,但是至少自增。
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3814 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 10ms · UTC 10:27 · PVG 18:27 · LAX 02:27 · JFK 05:27
Developed with CodeLauncher
♥ Do have faith in what you're doing.