分布式 ID 生成:雪花算法与号段模式实战
分布式 ID 生成雪花算法与号段模式实战背景与动机单体时代我们习惯用数据库自增主键AUTO_INCREMENT给每行数据编号。它简单、有序、占用空间小。但一旦进入分布式与分库分表场景这套方案立刻失灵跨库无法保证全局唯一订单表按用户 ID 取模拆成 8 个库每个库的id都从 1 自增合并后必然撞号。分库分表后无法做全局排序自增主键隐含时间序跨库后这个序被打破按id翻页会出现错乱。暴露业务量连续 ID 让竞对轻易算出你每天的注册量、订单量存在信息泄漏风险。数据库成为瓶颈高并发写入时每次都要找库拿号DB 压力陡增。于是我们需要一种全局唯一、趋势递增、高可用、低延迟的分布式 ID 方案。业界主流有两类思路一类是算法派本地计算如雪花算法 Snowflake一类是集中发号派DB/中间件统一分配如号段模式 Leaf-segment。下面逐一拆解并给出可运行实现。核心概念与技术选型先澄清几个 ID 的核心指标全局唯一最基本要求。趋势递增不一定严格递增但整体单调递增方便 BTree 索引顺序写、避免页分裂。单调递增严格递增便于排序但可能暴露流量。高可用 低延迟发号服务不能成为链路单点且耗时应在微秒级。常见方案对比方案唯一性趋势递增性能依赖主要缺点UUID极高否无序高本地无36 字符太长、无序导致索引碎片化数据库自增单库单库内唯一是低IODB无法跨库、有单点RedisINCR高是高Redis强依赖 Redis 可用性、宕机可能重复雪花算法 Snowflake高是极高本地时钟时钟回拨问题、workerId 分配难号段模式 Leaf-segment高是高双缓冲DB号段用尽瞬间有 DB 抖动、号段浪费选型结论对绝大多数业务雪花算法是零依赖、低延迟的首选当需要严格可控、可审计、不依赖时钟的场景如金融单据号号段模式更稳。两者可以并存核心交易走号段日志/埋点走雪花。分步实现过程方案一雪花算法Java 实现雪花算法把 64 位 long 拆成1 位符号位(0) | 41 位时间戳 | 10 位机器 ID | 12 位序列号。每秒可生成约 409.6 万个 ID。publicclassSnowflakeIdGenerator{// 起始时间戳可自定义为项目启动时间能多撑几十年privatefinallongepoch1700000000000L;privatefinallongworkerIdBits10L;privatefinallongsequenceBits12L;privatefinallongmaxWorkerId~(-1LworkerIdBits);// 1023privatefinallongworkerIdShiftsequenceBits;// 12privatefinallongtimestampShiftsequenceBitsworkerIdBits;// 22privatefinallongsequenceMask~(-1LsequenceBits);// 4095privatefinallongworkerId;privatelongsequence0L;privatelonglastTimestamp-1L;publicSnowflakeIdGenerator(longworkerId){if(workerId0||workerIdmaxWorkerId){thrownewIllegalArgumentException(workerId 超出范围 0~maxWorkerId);}this.workerIdworkerId;}publicsynchronizedlongnextId(){longtimestampSystem.currentTimeMillis();// 时钟回拨直接抛异常也可改为等待见下文权衡if(timestamplastTimestamp){thrownewRuntimeException(时钟回拨拒绝生成 ID);}if(timestamplastTimestamp){// 同一毫秒内序列号自增sequence(sequence1)sequenceMask;if(sequence0){// 当前毫秒序列用尽自旋等到下一毫秒timestampwaitNextMillis(lastTimestamp);}}else{sequence0L;// 进入新毫秒序列号归零}lastTimestamptimestamp;// 拼接时间戳左移 22 机器左移 12 序列return((timestamp-epoch)timestampShift)|(workerIdworkerIdShift)|sequence;}privatelongwaitNextMillis(longlastTs){longtsSystem.currentTimeMillis();while(tslastTs){tsSystem.currentTimeMillis();}returnts;}}调用方只需new SnowflakeIdGenerator(workerId).nextId()本地计算、无网络开销。方案二号段模式Leaf-segment核心思想DB 里存每张业务的当前号段max_id与步长step应用一次拉取一整段如 1000 个到内存用完了再去 DB 取下一个段。配合双缓冲几乎消除取号时的 DB 抖动。建表CREATETABLEid_segment(biz_tagVARCHAR(64)PRIMARYKEY,-- 业务标识如 ordermax_idBIGINTNOTNULL,-- 当前已分配号段的上界stepINTNOTNULL,-- 每次拉取的步长versionINTNOTNULL-- 乐观锁防并发覆盖);Java 取号简化版含双缓冲思路publicclassSegmentIdGenerator{// 双缓冲当前段用 buffer1快用完时异步加载 buffer2privatevolatileSegmentcurrent;privatevolatileSegmentnext;privatefinalintstep1000;staticclassSegment{longcur;// 当前游标longmax;// 本段上界booleanloading;}publicsynchronizedlongnextId(StringbizTag){// 1. 先用当前段发号if(current.curcurrent.max){// 2. 当前段已空且下一段就绪则切换否则同步去 DB 取if(next!null){currentnext;nextnull;}else{loadFromDb(bizTag);}}// 3. 使用量超过 80%提前异步加载下一段避免用尽时阻塞if(!current.loading(current.max-current.cur)step*0.2){asyncLoadNext(bizTag);}returncurrent.cur;}// 关键点UPDATE ... SET max_id max_id step WHERE biz_tag ?// 用 version 乐观锁或行锁保证并发安全取回后本地 max 旧 max stepprivatevoidloadFromDb(StringbizTag){/* DB 原子更新并取回新段上界 */}privatevoidasyncLoadNext(StringbizTag){/* 线程池异步预取 */}}loadFromDb的本质是一条UPDATE id_segment SET max_id max_id step, version version1 WHERE biz_tag ? AND version old取回成功后本地段的max即为新上界避免了先读后写的并发冲突。踩坑、边界条件与权衡取舍1. 雪花算法的时钟回拨这是头号坑。NTP 同步、虚拟机休眠恢复都可能让系统时间往回跳。直接抛异常会导致短暂不可用更稳妥的做法是回拨幅度小如 5ms时自旋等待幅度大时切换备用 workerId 或报警人工介入。绝对不能为了不报错而把时间戳强行往回取序列号否则会生成与历史重复的 ID。2. workerId 如何分配10 位机器位最多支持 1024 个节点但 workerId 不能写死在配置里扩缩容必撞。推荐启动向注册中心如 ZooKeeper / Nacos申请一个有序临时节点序号或基于IP 端口哈希取模容器化环境建议通过环境变量注入避免 Pod 重建后重复。3. 号段浪费与 DB 抖动如果某业务号段step1000但一天只用 50 个服务重启后未用的 950 个就永久浪费ID 不连续可接受但审计需注意。同时首次取号和段切换临界会有一次 DB 往返双缓冲把它降到几乎无感但 DB 本身必须高可用否则发号链路全断。4. 趋势递增 ≠ 严格递增雪花算法在时钟回拨修复、workerId 不同节点间可能出现后发的 ID 更小的局部乱序。若你的下游强依赖严格有序如按 ID 做binlog 顺序消费需额外加逻辑或改用号段模式。5. 时间位耗尽41 位毫秒时间戳约可用 69 年从自定义 epoch 起算。务必把epoch设为项目起始时间而非 1970否则可用年限被白白浪费一半。小结与延伸阅读分布式 ID 没有银弹只有适配场景优先雪花算法无依赖、低延迟、趋势递增适合绝大多数内部业务主键、日志追踪 ID。选号段模式需要可控、可审计、规避时钟问题的金融/单据类场景配合双缓冲保性能。避坑要点时钟回拨处理、workerId 动态分配、epoch 合理设置、号段双缓冲与步长评估。落地时建议做一个统一发号 SDK把两种算法封装在背后业务方只调用IdGenerator.next(order)未来替换算法不侵入业务代码。延伸阅读Twitter Snowflake 原始设计snowflake-2010美团 Leaf 开源实现Leaf-segment / Leaf-snowflake 双模式百度 UidGenerator基于 Snowflake 的改进用Delta seconds worker sequence结构《数据密集型应用系统设计》DDIA中分布式唯一标识相关章节

相关新闻

基于SpringBoot的社区鲜奶订购系统的设计与实现(毕设源码+文档)

基于SpringBoot的社区鲜奶订购系统的设计与实现(毕设源码+文档)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/26 7:06:34 阅读更多 →
下载 | Win11 23H2正式版最新ISO系统映像 (22631.7517、多合一版本)-修复系统问题

下载 | Win11 23H2正式版最新ISO系统映像 (22631.7517、多合一版本)-修复系统问题

⏩ 【资源A010】Win11 23H2正式版最新原版ISO系统映像🔶 Windows 11 23H2 正式版渠道的最新ISO系统映像,2026年8月更新版本已上传,资源链接内会定期跟进,更新ISO版本,建议收藏备用!Win11 23H2最新ISO映像下…

2026/8/26 5:37:20 阅读更多 →
性能测试面试全攻略:从原理到实战

性能测试面试全攻略:从原理到实战

1. 性能测试面试题全景解析作为软件测试领域的关键分支,性能测试在当今互联网产品研发中扮演着至关重要的角色。根据我十年测试团队管理经验,性能测试工程师的面试往往聚焦于技术深度与实践能力的双重考察。这份汇总不仅包含高频理论考点,更整…

2026/8/25 4:30:13 阅读更多 →

最新新闻

特征值与特征向量:从几何直观到PCA降维与矩阵对角化实战

特征值与特征向量:从几何直观到PCA降维与矩阵对角化实战

1. 项目概述:为什么特征值与特征向量是线性代数的“灵魂”如果你学线性代数,学到矩阵乘法、行列式、秩这些概念,感觉还像是在处理一堆数字的排列组合,那么从特征值和特征向量开始,这门课的味道就彻底变了。我第一次真正…

2026/8/26 7:07:16 阅读更多 →
基于YOLOv8的车道抛洒物检测:从数据标注到边缘部署实战解析

基于YOLOv8的车道抛洒物检测:从数据标注到边缘部署实战解析

简介:目标检测作为计算机视觉的核心任务,在智慧交通、自动驾驶和道路安全监控等领域有着广泛应用。实际场景中,目标尺度小、背景复杂、光照变化剧烈,传统检测算法难以兼顾精度与实时性。YOLOv8作为高效的一阶段检测器,…

2026/8/26 7:07:16 阅读更多 →
用PIC32打造纯MCU迷你街机:从硬件到游戏开发的完整实践

用PIC32打造纯MCU迷你街机:从硬件到游戏开发的完整实践

最近把吃灰半年的一块PIC32开发板翻出来,做了一个能玩俄罗斯方块、贪吃蛇和打砖块的小型街机。先说明一下,不是那种跑Linux的高大上模拟器方案,而是纯MCU实现的“硬核”迷你街机。整个项目从选型、画板到写游戏逻辑,折腾了大概三周…

2026/8/26 7:07:16 阅读更多 →
基于树莓派的救援机器人实战:从硬件选型到代码实现

基于树莓派的救援机器人实战:从硬件选型到代码实现

做救援机器人这件事,我折腾了差不多大半年,从最开始用Arduino加几个超声波模块的小玩具,到最后用树莓派(Raspberry Pi)做主控、带着摄像头和一堆传感器能在废墟模拟场里穿行的完整原型机,中间踩过的坑真不少…

2026/8/26 7:07:16 阅读更多 →
Claude Code权限模式详解:从文件编辑到终端命令的精细化AI协作管控

Claude Code权限模式详解:从文件编辑到终端命令的精细化AI协作管控

1. 从“助手”到“协作者”:Claude Code权限模式的核心价值如果你和我一样,长期在VSCode里和各种AI编程助手打交道,从早期的GitHub Copilot到后来的Cursor,再到如今风头正劲的Claude Code,一个最直观的感受是&#xff…

2026/8/26 7:07:16 阅读更多 →
基于YOLOv5的手部X光骨骼检测:从数据工程到模型部署实战

基于YOLOv5的手部X光骨骼检测:从数据工程到模型部署实战

1. 项目缘起:从一张X光片说起作为一名长期混迹于计算机视觉和医疗影像交叉领域的技术人,我经常被问到:“你们搞AI的,到底能不能帮医生看片子?” 这个问题背后,是临床医生每天面对海量影像数据时&#xff0c…

2026/8/26 7:06:16 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →