Java在分布式ID生成器(雪花算法)中的实现与优化

简介: 在分布式系统中,需要全局唯一、趋势递增、高性能的ID(如订单号、消息ID)。数据库自增ID在分库分表后不再唯一;UUID无序且过长,影响索引性能。

1.分布式ID的需求
在分布式系统中,需要全局唯一、趋势递增、高性能的ID(如订单号、消息ID)。数据库自增ID在分库分表后不再唯一;UUID无序且过长,影响索引性能。Twitter开源的雪花算法(Snowflake)产生64位长整型ID:1位符号位+41位时间戳(毫秒级,可用69年)+10位工作机器ID(最多1024节点)+12位序列号(每毫秒最多4096个)。Java是实现雪花算法的热门语言。

2.基本Java实现
核心是一个synchronized方法,记录上次生成时间戳和序列号。当时间戳变化时,序列号重置;当同一毫秒内,序列号自增并检查是否溢出(超过4095),若溢出则等待下一毫秒。
参考:https://xgmoi.cn/category/siji.html

3.时钟回拨问题与解决
雪花算法依赖系统时钟。如果时钟回拨(如NTP调整),可能会生成重复ID。解决方案:
拒绝策略:检测到时钟回拨超过阈值(如5秒),抛异常或阻塞等待时间追上。
使用Zookeeper记录上次时间:当回拨发生时,从ZK获取最后分配的时间戳,暂停直到超过它。
改用美团的Leaf方案:不依赖时钟,而是通过数据库号段或双buffer。

4.高性能优化
单机雪花算法每秒可生成数万ID,瓶颈在synchronized。改进:
预分配序列号:每个Worker预取一批序列号到本地,减少锁竞争。
使用LongAdder或AtomicLong,但需要保证唯一性,不建议。
多worker实例:如果一台机器需要极高QPS,可启动多个worker(不同机器ID),通过负载均衡分配请求。
参考:https://xgmoi.cn/category/xinli.html

5.案例:电商订单中心
某电商每天订单量约5000万,使用雪花算法生成订单ID,部署8个节点,每个节点配置机器ID(1-8)。Java实现:
时钟回拨处理:启动时从数据库读取上次最大时间戳,如果时钟回拨超过1秒,报警并自杀。
序列号位数调整为16位(每毫秒65536),时间戳位数相应减少(可满足50年)。
测试单机最高生成15万ID/秒,满足峰值需求。

6.其他分布式ID方案
数据库号段模式:批量从DB取ID段,缓存到内存。
Redis自增:INCR原子操作,但依赖Redis性能。
UUID:36字符,不适合作为数据库主键(碎片严重)。

7.总结
Java实现雪花算法简单可靠,已在无数分布式系统中验证。合理设计机器ID分配策略和时钟回拨处理,即可获得高性能、全局唯一的ID。对于大多数业务场景,雪花算法是分布式ID的首选。
参考:https://xgmoi.cn

目录
相关文章
升级mybatis-plus到3.5.3.1和JSQLParser 从4.3升级到4.6版本引起的插入问题解决
升级mybatis-plus到3.5.3.1和JSQLParser 从4.3升级到4.6版本引起的插入问题解决
2303 0
|
1月前
|
缓存 NoSQL Java
Java在大型多人在线游戏(MMO)服务端的运用
大型多人在线游戏(如《魔兽世界》《最终幻想14》《梦幻西游》)的服务端需要同时处理数万玩家的实时交互,包括移动同步、战斗计算、聊天、交易、工会等。
207 0
|
4天前
|
存储 人工智能 运维
千亿级 AI 搜索的效能实战:从混合检索到 Agentic RAG 的三年实战
本文为2026 Elastic中国大会演讲实录,直击千亿级AI搜索三大挑战:搜索融合(关键词+向量+稀疏检索原生一体)、极致效能(冷热分层、硬件降级、自研FalconSeek引擎)与Agentic RAG演进(结构化知识图谱+智能体自主推理),揭示企业级AI搜索从“能用”到“好用”再到“自进化”的实战路径。
273 8
|
4天前
|
缓存 前端开发 安全
ReAct推理链的工程化实现与最佳实践
本文介绍向量空间JBoltAI平台基于Spring Boot 3.x与Java 21实现的企业级ReAct推理链架构,涵盖分层设计、模板方法、Function Calling驱动、并发安全机制及推理可视化等核心实践,助力LLM能力可靠落地。
|
4天前
|
安全 Java 数据建模
【Java基础】JDK17:密封类、模式匹配、Record类(附《思维导图》+《面试高频考点清单》)
Java 17作为LTS版本,重磅引入密封类、模式匹配与Record类三大特性:Record简化不可变数据建模,密封类精准控制继承边界,模式匹配(instanceof+switch)提升类型安全与代码简洁性。三者协同可优雅实现代数数据类型,标志着Java迈向更安全、简洁、表达力更强的现代编程语言。
【Java基础】JDK17:密封类、模式匹配、Record类(附《思维导图》+《面试高频考点清单》)
|
4天前
|
存储 并行计算 安全
【Java基础】Java 8-21新特性 :Lambda表达式、函数式接口、Stream流、Optional(附《思维导图》+《面试高频考点清单》)
本文系统梳理Java 8–21核心新特性,聚焦面试高频考点:Lambda表达式、函数式接口、Stream流(惰性求值/并行流/map与flatMap区别)、Optional空值安全处理,并涵盖JDK9–21关键演进(模块化、var、Record、虚拟线程等),辅以原理剖析与实战代码,助力高效备战。
|
4天前
|
NoSQL 安全 PHP
PHP在支付系统回调处理与防重放攻击中的实践
支付渠道(支付宝、微信、Stripe)在用户支付成功后会异步向商户服务器发送回调(Webhook)通知,告知交易结果。
127 3
|
4天前
|
存储 算法 C++
C++在高性能内存池(MemoryPool)设计与实现
频繁调用new/delete或malloc/free会造成性能损耗(系统调用、锁竞争、内存碎片)。
119 3
|
4天前
|
人工智能 运维 安全
【Skills专题】alibabacloud-polardbx-ai-assistant:你的分布式数据库运维专家
PolarDB-X AI助手Skill将分布式数据库运维能力封装为AI可调用的标准化技能,支持自然语言交互,覆盖慢SQL分析、集群监控等15类场景。通过统一API、安全认证与多轮对话机制,在保障只读安全前提下,显著降低MTTR,助力开发者零门槛实现智能运维。
93 3
|
4天前
|
存储 人工智能 前端开发
本地离线知识库的隐私底线 数据落用户目录不出域,察元AI还超级智能体
察元AI桌面版坚守“数据不出域”核心承诺:所有对话、知识库、文件、密钥、日志均本地存储(CHAYUAN_ROOT下),默认禁用遥测,Sidecar绑定127.0.0.1,模型密钥强加密。支持Ollama等本地模型实现完全闭环,0字节外传,满足政企等保与国产化合规要求。(239字)