新闻详情

新闻详情

首页 / 资讯中心 / 详情

Go 分布式 ID 生成器:雪花算法 + Leaf 实战

发布时间:2026/10/2 2:23:56来源:尧图网络
Go 分布式 ID 生成器:雪花算法 + Leaf 实战
Go 分布式 ID 生成器雪花算法 Leaf 实战分布式 ID 是系统分库分表、消息追踪的基础。本文从经典 Snowflake 到美团 Leaf 提供实战方案。一、为什么不用数据库自增分库分表后单库自增无法全局唯一UUID 太长、不是数字序ID 是业务的导航必须稳定。二、Snowflake 64 位 IDSnowflake 把 64 bit 划分为0 | 0000... | 0000... | 0000... | 0000 1bit | 41bit ts | 10bit worker | 12bit seq1 符号位41 时间戳毫秒5 5 datacenter worker id10 bit12 序列每毫秒 4096 个三、Sony Snowflakeimportgithub.com/sony/sonyflakesf:sonyflake.NewSonyflake(sonyflake.Settings{StartTime:time.Now(),MachineID:func()(uint16,error){returnuint16(rdm.MachineID()),nil},})id,err:sf.NextID()特点时间戳 序列号32 bit Epoch 8 bit MachineID 16 bit Sequence单节点 QPS 5w四、美团 LeafLeaf-snowflake数据库分配 worker IDhttp / grpc 提供取 id 服务高可用Leaf-segment数据库号段由 proxy 服务下发每次取一段 ID 缓存到内存cache miss 再读 DBqps 10w五、snowflake 实战完整示例typeSnowflakestruct{mu sync.Mutex lastTsint64sequenceint64workerIDint64datacenterIDint64}func(s*Snowflake)Next()int64{s.mu.Lock()defers.mu.Unlock()ts:time.Now().UnixMilli()iftss.lastTs{s.sequence(s.sequence1)0xFFF// 12 bitifs.sequence0{// 等到下一毫秒fortss.lastTs{tstime.Now().UnixMilli()}}}else{s.sequence0}s.lastTstsreturn(ts22)|(s.workerID12)|s.sequence}六、Leaf-segment Go 实战typeSegmentsstruct{mu sync.Mutex curMaxint64curMinint64db*sql.DB}func(s*Segments)Fetch(bizTagstring,stepint64)error{s.mu.Lock()defers.mu.Unlock()// SELECT GET, STEP, UPDATE FROM leaf_alloc WHERE biz_tag? FOR UPDATEerr:s.db.QueryRow( UPDATE leaf_alloc SET max_id max_id step, cur_maxmax_id WHERE biz_tag ?,bizTag).Scan(s.curMax)s.curMins.curMax-step1returnerr}func(s*Segments)Next()int64{s.mu.Lock()defers.mu.Unlock()ifs.curMins.curMax{// 重新 fetchs.Fetch(...)}id:s.curMin s.curMinreturnid}七、时钟回拨问题服务器 NTP 同步导致时间回退雪花 ID 重复。解决方案拒绝发号返回错误默认继续使用上次时间启用 leaf-segment 兜底iftss.lastTs{// 启用拒绝策略return0,ErrClockBack}八、K8s 环境 worker idimportk8s.io/client-go/kubernetespods,_:client.CoreV1().Pods(default).List(ctx,metav1.ListOptions{LabelSelector:appsnowflake})machine:uint64(getHostname())%32每个 Pod 取机器名哈希即可。九、踩坑清单不要把 snowflake 节点时钟倒退——能停服务就停下Leaf 写入 DB max_id——分段号可靠worker id 多节点都要唯一测试时别用真实 snowflake——改 unit ID十、ID 与业务结合// 拼出一个更短的 IDfunc(idint64)String()string{returnstrconv.FormatInt(id,36)// base36}66bit 数字用 base36 编码约等于 13 个字符更紧凑。十一、总结与展望雪花算法适合纯内部追踪号段服务适合对外部 API 公开的号需求。两者可以结合主路径用叶子号段回退路径用雪花。未来IDaaS 化、IDaaS-native 与 ServiceMesh 集成将是趋势。十二、参考文献sony/sonyflake 仓库美团 Leaf 服务Twitter Snowflake 原始论文
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Hudi与Hive整合实战:高效增量数据处理与查询方案 2026/10/2 3:17:11

Hudi与Hive整合实战:高效增量数据处理与查询方案

1. 方案背景与整体设计思路1.1 Hive在增量数据处理上的老问题做数仓的兄弟应该都有过这种经历:业务方每天凌晨跑批,结果当天晚上发现上游数据有修正,某张事实表里昨天的数据需要更新几百万行。Hive原生表不支持高效的按行更新,常见…

阅读更多 →
Flutter插件鸿蒙适配:接入CloudWatch日志与监控 2026/10/2 3:17:11

Flutter插件鸿蒙适配:接入CloudWatch日志与监控

从 Flutter 项目迁到 OpenHarmony 设备上跑,最头疼的往往不是 Dart 侧,而是那些看起来人畜无害的三方插件。aws_cloudwatch_api就是这样的角色:在 Android 上接 CloudWatch,直接挂 AWS SDK 就行,全程十几分钟&#xff…

阅读更多 →
Vue+Pinia+Vitest测试实战:从Mock陷阱到集成验证 2026/10/2 3:17:05

Vue+Pinia+Vitest测试实战:从Mock陷阱到集成验证

1. 这不是背诵清单,而是测试工程师的实战决策地图“软件测试方法和技术期末总复习”——看到这个标题,我第一反应不是翻书,而是打开自己上个月刚交付的支付模块测试报告。当时在回归测试阶段卡了整整两天,问题表面是“订单状态不更…

阅读更多 →
循环码完全指南:Hamming码、Golay码与CRC的数学原理和工程实现 2026/10/2 3:16:52

循环码完全指南:Hamming码、Golay码与CRC的数学原理和工程实现

搞过通信、存储或者嵌入式的人,大概率都跟“校验”这个东西打过交道。本科信息论课上,循环码往往被摆在很后面的章节,一本教材啃到那里已经快期末了,很多人只记得“啊,这个码有个生成多项式,算起来全是多项…

阅读更多 →
Windows安装Docker全攻略:WSL2与MySQL/Redis实战 2026/10/2 3:16:52

Windows安装Docker全攻略:WSL2与MySQL/Redis实战

先别急着去官网下载安装包,Windows 上装 Docker,门槛从来不在“下载”这一步,而在安装之前的架构选择、系统设置,以及安装之后那一串看着就头大的报错。我这两年帮人排查过太多 Docker Desktop 启动失败的问题,十个里有…

阅读更多 →
EndNote中文文献“et al”改“等”的样式配置教程 2026/10/2 3:16:52

EndNote中文文献“et al”改“等”的样式配置教程

写毕业论文或者投中文期刊的时候,EndNote里插入的中文参考文献动不动就冒出一个“et al”,跟整篇中文行文风格格格不入,看一次糟心一次。这个问题其实不算复杂,但确实容易卡住很多人,因为EndNote默认的样式规则就是按英…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉