昨晚用 Golang 写了个 ID 生成服务,分享给大家

2017-11-19 11:11:33 +08:00
 owenliang

go-id-alloc

Golang+Mysql 实现的分布式 ID 生成服务

特性

地址: https://github.com/owenliang/go-id-alloc

4653 次点击
所在节点    Go 编程语言
36 条回复
myself659410
2017-11-19 21:05:47 +08:00
肯定楼主的动手出代码
都用 golang 还再加上 mysql 就为了分布式 uuid 实现起来觉得有点重了 依赖了 mysql,考虑到就帮,那 mysql 高可用也需要保证了吧
Chingim
2017-11-19 21:38:21 +08:00
只能有 2^64 个 id 吧,永不重复有点过了
owenliang
2017-11-19 21:48:00 +08:00
@Chingim 很有道理
owenliang
2017-11-19 21:52:36 +08:00
@myself659410 对 云或者公司都有能力提供高可用 mysql
ihuotui
2017-11-20 00:31:12 +08:00
有序 id 还是有用的
swulling
2017-11-20 00:49:11 +08:00
snowflake 加原子钟,直接硬件解决时间问题

便宜的原子钟才几百块
wowowo1
2017-11-20 02:49:50 +08:00
看了下代码,仿佛核心是先分区( 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 那套比较靠谱,虽然他不能保证连续,但是至少自增。
wowowo1
2017-11-20 02:52:23 +08:00
而且,mutex.lock 和 unlock 中间代码行数比较多,单个分片可能有性能问题。go 语言是否可以用 atomic.incr 那一套逻辑解决。

我只是稍微看了点代码,如有理解错误请提。
owenliang
2017-11-20 14:22:45 +08:00
@wowowo1 你理解错了,再看看代码吧。
ztao8607
2017-11-20 16:30:05 +08:00
@owenliang 问个问题,都记录在内存中,有容灾处理么?分布式节点中,多个节点 down 后,如何解决脑裂问题呢?
zkeeper
2017-12-03 07:24:54 +08:00
@owenliang 人家仔细看了代码,而且贴出来了自己的分析,即使你觉得错,多写两句告诉别人具体哪里你觉得有问题才是讨论的态度吧?什么都不说直接让人再看代码?别人估计不会再看了
owenliang
2017-12-03 11:47:26 +08:00
@zkeeper 看不看与我何干?感兴趣自己看,还有管闲事的,真是笑尿了
zkeeper
2017-12-03 21:06:51 +08:00
@owenliang 就你这个态度,真没必要把你的什么项目贴出来,指望别人不由分说就一脸膜拜交口称赞?你自嗨去吧
zkeeper
2017-12-03 21:07:35 +08:00
@zkeeper 拉黑
wowowo1
2017-12-14 18:02:49 +08:00
@zkeeper 蛤蛤蛤,没必要的。

至于态度,也还好吧。

但是第二天 astaxie 发了每日链接,有他这个 ID 生成器的设计的文章,感觉还好。

他自己也贴在一楼了。

毕竟有产出,有益于社会。

不用苛求太多。

我要是好不容易写个东西然后被楼上这么喷,我估计我也会毛的。
iceheart
2018-01-02 19:29:48 +08:00
1024

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/407627

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX