golang分布式唯一ID生成器插件库indigo的使用
Golang分布式唯一ID生成器插件库indigo的使用
关于Indigo
Indigo是一个基于Sonyflake并使用Base58编码的分布式唯一ID生成器。它具有以下特点:
- 生成的ID最大长度为11个字符(基于uint64的最大值)
- 可以通过自定义编码器替换默认的Base58编码器
安装
使用以下命令安装indigo库:
$ go get github.com/osamingo/indigo@latest
使用示例
下面是一个完整的indigo使用示例代码:
package main
import (
"log"
"sync"
"time"
"github.com/osamingo/indigo"
)
var g *indigo.Generator
func init() {
t := time.Unix(1257894000, 0) // 2009-11-10 23:00:00 UTC
g = indigo.New(nil, indigo.StartTime(t))
_, err := g.NextID()
if err != nil {
log.Fatalln(err)
}
}
func main() {
wg := sync.WaitGroup{}
wg.Add(100)
for i := 0; i < 100; i++ {
go func() {
defer wg.Done()
id, err := g.NextID()
if err != nil {
log.Fatalln(err)
} else {
log.Println("ID:", id)
}
}()
}
wg.Wait()
}
代码说明:
- 首先导入indigo包
- 在init函数中初始化生成器:
- 设置起始时间为2009-11-10 23:00:00 UTC
- 创建生成器实例
- 调用NextID()初始化生成器
- 在main函数中:
- 使用WaitGroup管理100个goroutine
- 每个goroutine调用NextID()生成唯一ID
- 打印生成的ID
性能基准测试
在MacBook Pro (14-inch, 2021)上的基准测试结果:
# Machine: MacBook Pro (14-inch, 2021)
# CPU : Apple M1 Pro
# Memory : 32 GB
goos: darwin
goarch: arm64
pkg: github.com/osamingo/indigo
BenchmarkGenerator_NextID-10 30079 39191 ns/op 7 B/op 1 allocs/op
PASS
参考
- Sonyflake - 受Twitter Snowflake启发的分布式唯一ID生成器
- Base58 - 用于将大整数表示为字母数字文本的二进制到文本编码方案
许可证
Indigo使用MIT许可证发布。
更多关于golang分布式唯一ID生成器插件库indigo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang分布式唯一ID生成器插件库indigo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Indigo - Golang分布式唯一ID生成器插件库使用指南
Indigo是一个用Go语言编写的分布式唯一ID生成器插件库,它支持多种ID生成算法,适合在分布式系统中生成全局唯一ID。
主要特性
- 支持多种ID生成算法(Snowflake、UUID、MongoDB ObjectID等)
- 插件化架构,易于扩展
- 高性能,低延迟
- 线程安全
安装
go get github.com/edwingeng/indigo
基本使用
1. 使用Snowflake算法
package main
import (
"fmt"
"github.com/edwingeng/indigo"
"github.com/edwingeng/indigo/snowflake"
)
func main() {
// 创建Snowflake生成器
// 参数:workerID (0-1023), 通常从环境变量或配置中心获取
sf := snowflake.NewSnowflake(1)
// 生成ID
id := sf.NextID()
fmt.Println("Snowflake ID:", id)
// 解析ID
timestamp, workerID, sequence := snowflake.ParseID(id)
fmt.Printf("Parsed: timestamp=%d, workerID=%d, sequence=%d\n",
timestamp, workerID, sequence)
}
2. 使用UUID算法
package main
import (
"fmt"
"github.com/edwingeng/indigo"
"github.com/edwingeng/indigo/uuid"
)
func main() {
// 创建UUID生成器
generator := uuid.NewUUIDGenerator()
// 生成UUID v4
id := generator.NextID()
fmt.Println("UUID:", id)
// 生成UUID字符串
strID := generator.NextStringID()
fmt.Println("String UUID:", strID)
}
3. 使用MongoDB ObjectID算法
package main
import (
"fmt"
"github.com/edwingeng/indigo"
"github.com/edwingeng/indigo/mongoid"
)
func main() {
// 创建MongoID生成器
generator := mongoid.NewMongoIDGenerator()
// 生成ID
id := generator.NextID()
fmt.Println("MongoID:", id)
// 生成十六进制字符串表示
strID := generator.NextStringID()
fmt.Println("String MongoID:", strID)
}
高级用法
自定义ID生成器
package main
import (
"fmt"
"github.com/edwingeng/indigo"
)
// 自定义ID生成器
type MyGenerator struct{}
func (g *MyGenerator) NextID() int64 {
// 实现你自己的ID生成逻辑
return 123456789
}
func (g *MyGenerator) NextStringID() string {
return "my-custom-id"
}
func main() {
// 注册自定义生成器
indigo.Register("my-generator", func() indigo.IDGenerator {
return &MyGenerator{}
})
// 使用自定义生成器
generator := indigo.NewGenerator("my-generator")
id := generator.NextID()
fmt.Println("Custom ID:", id)
}
使用Indigo的插件系统
package main
import (
"fmt"
"github.com/edwingeng/indigo"
"github.com/edwingeng/indigo/plugin"
)
func main() {
// 加载插件
p, err := plugin.Load("path/to/plugin.so")
if err != nil {
panic(err)
}
// 从插件获取生成器
generator, err := p.NewGenerator()
if err != nil {
panic(err)
}
// 使用插件提供的生成器
id := generator.NextID()
fmt.Println("Plugin ID:", id)
}
性能考虑
Indigo在设计时考虑了高性能需求,以下是性能优化建议:
- 对于高并发场景,考虑使用
sync.Pool
来重用生成器 - 批量生成ID时,可以使用
BatchNextID(n int) []int64
方法 - 避免频繁创建和销毁生成器实例
生产环境建议
- 在分布式环境中,确保每个节点的worker ID是唯一的
- 对于Snowflake算法,考虑使用Zookeeper/Etcd等协调服务分配worker ID
- 监控ID生成速率和序列号使用情况
- 考虑实现ID生成服务的熔断机制
总结
Indigo提供了灵活、高性能的分布式ID生成解决方案,通过插件化架构支持多种ID生成算法,并允许开发者轻松扩展。根据你的业务需求选择合适的算法(如需要时间有序性选择Snowflake,需要简单唯一性选择UUID),可以满足大多数分布式系统的ID生成需求。
更多高级用法和配置选项,请参考Indigo的官方文档和源代码。