sonyflake 同样是受 Twitter 的 snowflake 启发而来,但 sonyflake 侧重于多主机/实例的生命周期和性能,所以与 snowflake 使用不同的位分配:
sonyflake 的优点和缺点:
- 比 snowflake 更长的生命周期,174年 > 69年
- 能运行在更多的实例上,216 > 210
- 生成 ID 速度比 snowflake 慢,10 毫秒内最多生成 28 个(snowflake 1 毫秒内最多生成 212 个)
sonyflake 在启动阶段需要配置参数:
func NewSonyflake(st Settings) *Sonyflake
Settings
数据结构如下:
type Settings struct {
StartTime time.Time
MachineID func() (uint16, error)
CheckMachineID func(uint16) bool
}
StartTime
起始时间,默认值为2014-09-01 00:00:00 +0000 UTC
MachineID
是一个返回实例 ID 的函数,如果不定义此函外,默认用本机ip
的低16位CheckMachineID
验证实例 ID / 计算机ID 的唯一性,返回true
时才创建
使用示例:
package main
import (
"github.com/sony/sonyflake"
)
func getMachineID() (uint16, error) {
var machineID uint16 = 6
return machineID, nil
}
func checkMachineID(machineID uint16) bool {
existsMachines := []uint16{1, 2, 3, 4, 5}
for _, v := range existsMachines {
if v == machineID {
return false
}
}
return true
}
func main() {
t, _ := time.Parse("2006-01-02", "2021-01-01")
settings := sonyflake.Settings{
StartTime: t,
MachineID: getMachineID,
CheckMachineID: checkMachineID,
}
sf := sonyflake.NewSonyflake(settings)
for i := 0; i < 10; i++ {
id, err := sf.NextID()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println(id)
}
}
最后编辑: kuteng 文档更新时间: 2022-03-22 19:29 作者:kuteng