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()
}

代码说明:

  1. 首先导入indigo包
  2. 在init函数中初始化生成器:
    • 设置起始时间为2009-11-10 23:00:00 UTC
    • 创建生成器实例
    • 调用NextID()初始化生成器
  3. 在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。

主要特性

  1. 支持多种ID生成算法(Snowflake、UUID、MongoDB ObjectID等)
  2. 插件化架构,易于扩展
  3. 高性能,低延迟
  4. 线程安全

安装

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在设计时考虑了高性能需求,以下是性能优化建议:

  1. 对于高并发场景,考虑使用sync.Pool来重用生成器
  2. 批量生成ID时,可以使用BatchNextID(n int) []int64方法
  3. 避免频繁创建和销毁生成器实例

生产环境建议

  1. 在分布式环境中,确保每个节点的worker ID是唯一的
  2. 对于Snowflake算法,考虑使用Zookeeper/Etcd等协调服务分配worker ID
  3. 监控ID生成速率和序列号使用情况
  4. 考虑实现ID生成服务的熔断机制

总结

Indigo提供了灵活、高性能的分布式ID生成解决方案,通过插件化架构支持多种ID生成算法,并允许开发者轻松扩展。根据你的业务需求选择合适的算法(如需要时间有序性选择Snowflake,需要简单唯一性选择UUID),可以满足大多数分布式系统的ID生成需求。

更多高级用法和配置选项,请参考Indigo的官方文档和源代码。

回到顶部