(11)go-micro微服务雪花算法

简介: (11)go-micro微服务雪花算法

一 雪花算法介绍

雪花算法是推特开源的分布式ID生成算法,用于在不同的机器上生成唯一的ID的算法。

该算法生成一个64bit的数字作为分布式ID,保证这个ID自增并且全局唯一。


63.png

1.第一位占用1bit,其值始终是0,没有实际作用。


2.时间戳占用41bit,单位为毫秒,总共可以容纳约69年的时间。当然,我们的时间毫秒计数不会真的

从1970年开始记,那样我们的系统跑到2039/9/7 23:47:35 就不能用了,所以这里的时间戳只是相对

于某个时间的增量,比如我们的系统上线是2020-07-01,那么我们完全可以把这个timestamp当作是

从2022-10-01 00:00: 00.000的偏移量。


3.工作机器id占用10bit,其中高位5bit是数据中心ID,低位5bit是 工作节点ID,最多可以容纳1024个节

点。


4.序列号占用12bit,用来记录同毫秒内产生的不同id。每个节点每毫秒0开始不断累加,最多可以累加

到4095,同一毫秒-共可以产生4096个ID。

SnowFlake算法在同- -毫秒内最多可以生成多少个全局唯- -ID呢?

同-毫秒的ID数量= 1024 X 4096 = 4194304


二 雪花算法优缺点

雪花算法有以下几个优点:


高并发分布式环境下生成不重复 id,每秒可生成百万个不重复 id。


基于时间戳,以及同一时间戳下序列号自增,基本保证 id 有序递增。


不依赖第三方库或者中间件。


算法简单,在内存中进行,效率高。


雪花算法有如下缺点:


依赖服务器时间,服务器时钟回拨时可能会生成重复 id。


三 雪花算法实现

package snow_flake
import (
   "github.com/golang/glog"
   "sync"
   "time"
)
type Snowflake struct {
   sync.Mutex         // 锁
   timestamp    int64 // 时间戳 ,毫秒
   workerid     int64 // 工作节点
   datacenterid int64 // 数据中心机房id
   sequence     int64 // 序列号
}
const (
   epoch             = int64(1577808000000)                           // 设置起始时间(时间戳/毫秒):2020-01-01 00:00:00,有效期69年
   timestampBits     = uint(41)                                       // 时间戳占用位数
   datacenteridBits  = uint(2)                                        // 数据中心id所占位数
   workeridBits      = uint(7)                                        // 机器id所占位数
   sequenceBits      = uint(12)                                       // 序列所占的位数
   timestampMax      = int64(-1 ^ (-1 << timestampBits))              // 时间戳最大值
   datacenteridMax   = int64(-1 ^ (-1 << datacenteridBits))           // 支持的最大数据中心id数量
   workeridMax       = int64(-1 ^ (-1 << workeridBits))               // 支持的最大机器id数量
   sequenceMask      = int64(-1 ^ (-1 << sequenceBits))               // 支持的最大序列id数量
   workeridShift     = sequenceBits                                   // 机器id左移位数
   datacenteridShift = sequenceBits + workeridBits                    // 数据中心id左移位数
   timestampShift    = sequenceBits + workeridBits + datacenteridBits // 时间戳左移位数
)
func (s *Snowflake) NextVal() int64 {
   s.Lock()
   now := time.Now().UnixNano() / 1000000 // 转毫秒
   if s.timestamp == now {
      // 当同一时间戳(精度:毫秒)下多次生成id会增加序列号
      s.sequence = (s.sequence + 1) & sequenceMask
      if s.sequence == 0 {
         // 如果当前序列超出12bit长度,则需要等待下一毫秒
         // 下一毫秒将使用sequence:0
         for now <= s.timestamp {
            now = time.Now().UnixNano() / 1000000
         }
      }
   } else {
      // 不同时间戳(精度:毫秒)下直接使用序列号:0
      s.sequence = 0
   }
   t := now - epoch
   if t > timestampMax {
      s.Unlock()
      glog.Errorf("epoch must be between 0 and %d", timestampMax-1)
      return 0
   }
   s.timestamp = now
   r := int64((t)<<timestampShift | (s.datacenterid << datacenteridShift) | (s.workerid << workeridShift) | (s.sequence))
   s.Unlock()
   return r
}

四 最后

  • 至此,go-micro微服务雪花算法开发工作就正式完成。
  • 接下来就开始JWT跨域认证的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。
相关文章
|
6月前
|
监控 算法 NoSQL
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
🌟蒋星熠Jaxonic:Go微服务限流熔断实践者。分享基于滑动窗口、令牌桶与自适应阈值的智能防护体系,助力高并发系统稳定运行。
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
|
6月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
191 2
|
6月前
|
算法 测试技术 Go
go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持
`dongle` 是一款轻量级、语义化、开发者友好的 Golang 密码库,100% 单元测试覆盖,获 2024 年 GVP 与 G-Star 双项荣誉。支持 SM4 国密算法,提供标准及流式处理,优化读取位置重置,提升安全性与易用性。文档齐全,开源免费,欢迎 Star!
336 0
|
6月前
|
算法 测试技术 Go
go-dongle v1.1.7 发布,新增 SM4 国密分组对称加密算法支持
`dongle` 是一款轻量级、语义化、开发者友好的 Golang 密码库,100% 单元测试覆盖,获 2024 年 GVP 与 G-Star 双项荣誉。支持 SM4 国密算法,提供标准及流式处理,优化读取位置重置,提升安全性与易用性。文档齐全,开源免费,欢迎 Star!
318 0
|
6月前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
250 15
|
10月前
|
算法 安全 Go
如何通过 go 语言实现雪花算法?
在Go语言中,可通过实现雪花算法(Snowflake)生成分布式唯一ID。该算法由Twitter提出,将64位ID分为时间戳、机器ID和序列号三部分。文章介绍了算法结构、Go语言实现代码、代码说明、示例输出、优点及注意事项。此算法具备高性能、分布式支持和有序性特点,适用于数据库主键等场景。使用时需确保机器ID唯一与时钟同步。
228 0
|
6月前
|
存储 缓存 算法
如何管理员工上网:基于 Go 语言实现的布隆过滤器访问拦截算法应用
布隆过滤器以空间换时间,通过多哈希函数实现黑名单的高效存储与毫秒级检索,解决传统方案内存占用大、响应慢等问题,助力企业低成本、高效率管理员工上网行为。
269 3
|
7月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
186 3
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
9月前
|
搜索推荐 算法 Go
Go语言数组排序(冒泡排序法)—— 用最直观的方式掌握排序算法
本案例介绍使用冒泡排序对整数数组进行升序排序的实现方法,涵盖输入处理、错误检查与排序逻辑。通过代码演示和算法解析,帮助理解排序原理及Go语言切片操作,为学习更复杂排序算法打下基础。