Go语言分布式ID生成器:雪花算法实战
Go语言分布式ID生成器雪花算法实战1. 分布式ID需求分析在分布式系统中唯一ID生成是一个基础但至关重要的需求。常见的解决方案包括UUID、数据库自增主键、号段模式以及本文重点介绍的雪花算法Snowflake。雪花算法由Twitter提出具有高性能、低延迟、有序可拼接等优点。2. 雪花算法原理雪花算法生成的ID是一个64位整数结构如下第1位符号位固定为0第2-42位时间戳毫秒可用69年第43-52位机器ID10位支持1024个节点第53-64位序列号每节点每毫秒支持4096个IDtype Snowflake struct { mu sync.Mutex timestamp int64 nodeID int64 sequence int64 epoch int64 } func NewSnowflake(nodeID int64) (*Snowflake, error) { if nodeID 0 || nodeID 1023 { return nil, errors.New(nodeID must be between 0 and 1023) } return Snowflake{ nodeID: nodeID, sequence: 0, epoch: time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC).Unix(), }, nil }3. 高性能实现const ( timestampBits 39 nodeIDBits 10 sequenceBits 12 maxTimestamp -1 ^ (-1 timestampBits) maxNodeID -1 ^ (-1 nodeIDBits) maxSequence -1 ^ (-1 sequenceBits) timestampShift nodeIDBits sequenceBits nodeIDShift sequenceBits ) func (s *Snowflake) Generate() int64 { s.mu.Lock() defer s.mu.Unlock() now : time.Now().UnixNano() / 1e6 if now s.timestamp { now s.timestamp } if now s.timestamp { s.sequence (s.sequence 1) maxSequence if s.sequence 0 { for now s.timestamp { now time.Now().UnixNano() / 1e6 } } } else { s.sequence 0 } s.timestamp now id : (now-s.epoch)timestampShift | (s.nodeIDnodeIDShift) | s.sequence return id }4. Go语言最佳实践type IDGenerator struct { snowflake *Snowflake mu sync.Pool } func NewIDGenerator(nodeID int64) (*IDGenerator, error) { sf, err : NewSnowflake(nodeID) if err ! nil { return nil, err } return IDGenerator{ snowflake: sf, mu: sync.Pool{ New: func() interface{} { return sync.Mutex{} }, }, }, nil } func (g *IDGenerator) NextID() string { return strconv.FormatInt(g.snowflake.Generate(), 10) }5. 总结雪花算法是分布式系统中生成唯一ID的经典方案具有高性能、有序、可预测等特点。本文介绍了Go语言的高性能实现方案。