如何在分布式系统中,实现一个有递增性且全局唯一的ID呢?
实现方案之: go实现雪花算法
雪花算法在上一节已经写过了,在代码里也有注释。
直接上代码 –>
1 | package snowflake |
如何使用呢?写了一个测试代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31func TestNewSnowflakeWorker(t *testing.T) {
// 指定workerId,保证不重复即可,实际要结合生产环境来看,最大支持1024个组合
worker, err := NewSnowflakeWorker(12)
if err != nil {
t.Fatal(err)
}
ch := make(chan int64)
defer close(ch)
count := 10000
for i := 0; i < count; i++ {
go func() {
id := worker.GenerateId()
ch <- id
}()
}
m := make(map[int64]int)
for i := 0; i < count; i++ {
id := <-ch
_, ok := m[id]
if ok {
t.Error("id is not unique")
return
}
m[id] = 1
}
fmt.Println("done...")
}
通过执行测试用例,生成的ID不会重复