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版本引起的插入问题解决
2471 0
|
SQL XML 关系型数据库
Mybatis-Plus通过SQL注入器实现真正的批量插入
Mybatis-Plus通过SQL注入器实现真正的批量插入
8629 0
Mybatis-Plus通过SQL注入器实现真正的批量插入
|
4月前
|
存储 人工智能 前端开发
本地离线知识库的隐私底线 数据落用户目录不出域,察元AI还超级智能体
察元AI桌面版坚守“数据不出域”核心承诺:所有对话、知识库、文件、密钥、日志均本地存储(CHAYUAN_ROOT下),默认禁用遥测,Sidecar绑定127.0.0.1,模型密钥强加密。支持Ollama等本地模型实现完全闭环,0字节外传,满足政企等保与国产化合规要求。(239字)
|
4月前
|
存储 缓存 算法
Java在分布式ID生成器(Leaf——美团技术方案)中的实现
1.分布式ID的更高要求 雪花算法依赖时钟,存在回拨问题;数据库号段方案需要频繁访问DB。美团的Leaf方案提供了两种模式:号段模式(Leaf-segment)和雪花模式(Leaf-snowflake),均用Java实现https://zzblmyl.com,解决了上述痛点。
345 0
|
4月前
|
存储 缓存 Java
Java在配置中心(Apollo/Nacos)设计中的核心贡献
微服务架构下,配置文件分散在各处,修改一个配置需要重启服务,效率低下且易出错。配置中心实现了配置的统一管理、动态刷新、版本控制、灰度发布。
365 2
|
4月前
|
存储 算法 C++
C++在高性能内存池(MemoryPool)设计与实现
频繁调用new/delete或malloc/free会造成性能损耗(系统调用、锁竞争、内存碎片)。
257 3
|
4月前
|
人工智能 运维 安全
【Skills专题】alibabacloud-polardbx-ai-assistant:你的分布式数据库运维专家
PolarDB-X AI助手Skill将分布式数据库运维能力封装为AI可调用的标准化技能,支持自然语言交互,覆盖慢SQL分析、集群监控等15类场景。通过统一API、安全认证与多轮对话机制,在保障只读安全前提下,显著降低MTTR,助力开发者零门槛实现智能运维。
188 3
|
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、虚拟线程等),辅以原理剖析与实战代码,助力高效备战。
|
5月前
|
缓存 NoSQL Java
Java在大型多人在线游戏(MMO)服务端的运用
大型多人在线游戏(如《魔兽世界》《最终幻想14》《梦幻西游》)的服务端需要同时处理数万玩家的实时交互,包括移动同步、战斗计算、聊天、交易、工会等。
659 0