零基础掌握分布式ID生成:从理论到实战的完整指南 [特殊字符]
一、为什么需要分布式ID? 🤔
在单机系统中,使用数据库自增ID就能满足需求。但在分布式系统中,多个服务节点同时生成ID时会出现以下问题:
-
ID冲突:不同节点生成相同ID
-
扩展困难:数据库自增ID无法水平扩展
-
安全性差:连续ID暴露业务数据量
-
性能瓶颈:高并发场景下生成速度慢
典型应用场景:
✅ 电商订单号生成
✅ 社交平台用户ID
✅ 物流运单号生成
✅ 金融交易流水号
二、分布式ID的核心要求 📝
| 特性 | 说明 | 重要性 |
|---|---|---|
| 全局唯一性 | 整个分布式系统内无重复 | ★★★★★ |
| 趋势递增 | 有利于数据库索引优化 | ★★★★☆ |
| 高可用性 | 任何故障不影响ID生成 | ★★★★★ |
| 高性能 | 每秒至少生成10万+ ID | ★★★★☆ |
| 信息安全 | 无法被猜测或遍历 | ★★★☆☆ |
三、主流分布式ID方案对比 🔍
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| UUID | 简单、无中心化 | 无序、存储空间大 | 临时标识、低并发场景 |
| 数据库自增 | 实现简单、严格递增 | 性能差、扩展困难 | 小型系统、数据迁移 |
| Redis生成 | 性能较好 | 依赖Redis、持久化问题 | 中等并发系统 |
| Snowflake | 高性能、趋势递增 | 时钟回拨问题 | 大型分布式系统 |
| Leaf | 高可用、支持多种模式 | 依赖外部组件 | 美团等大型互联网公司 |
| TinyID | 轻量级、易扩展 | 需要维护号段 | 滴滴等中型系统 |
四、Snowflake算法深度解析 ❄️
4.1 算法结构(64位)
0 | 0000000000 0000000000 0000000000 0000000000 0 | 00000 | 00000 | 000000000000
-
第1位:符号位(固定0)
-
2-42位:时间戳(41位,约69年)
-
43-52位:机器ID(5位数据中心 + 5位机器)
-
53-64位:序列号(12位,每毫秒4096个)
4.2 Java实现代码
public class SnowflakeIdWorker {private final long datacenterId; // 数据中心IDprivate final long workerId; // 机器IDprivate long sequence = 0L; // 序列号private long lastTimestamp = -1L; // 上次生成时间public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException("时钟回拨异常");}if (timestamp == lastTimestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - epoch) << timestampLeftShift)| (datacenterId << datacenterIdShift)| (workerId << workerIdShift)| sequence;}// 其他辅助方法省略...
}
4.3 解决时钟回拨问题
-
NTP时间同步:使用网络时间协议同步服务器时间
-
异常检测:在代码中增加时钟回拨检测逻辑
-
备用ID生成器:在发生回拨时切换备用方案
五、美团Leaf方案实战 🍃
5.1 号段模式(Segment)

5.2 Snowflake模式
# leaf.properties leaf.name=com.sankuai.leaf.opensource.test leaf.segment.enable=false leaf.snowflake.enable=true leaf.snowflake.zk.address=127.0.0.1 leaf.snowflake.port=2181
5.3 Spring Boot集成
// 添加依赖
<dependency><groupId>com.sankuai</groupId><artifactId>leaf-core</artifactId><version>1.0.2-RELEASE</version>
</dependency>// 使用示例
@Autowired
private IDGen idGen;public void createOrder() {String id = idGen.get().getId();// 使用生成的ID...
}
六、其他方案快速上手 ⚡
6.1 数据库自增ID
CREATE TABLE id_generator (id bigint(20) NOT NULL AUTO_INCREMENT,stub char(1) NOT NULL DEFAULT '',PRIMARY KEY (id),UNIQUE KEY stub (stub)
) ENGINE=InnoDB;-- 获取ID
REPLACE INTO id_generator (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
6.2 Redis生成ID
public class RedisIdGenerator {private static final String ID_KEY = "global:id";public Long nextId() {return redisTemplate.opsForValue().increment(ID_KEY);}
}
6.3 UUID(谨慎使用)
// 标准UUID
String uuid = UUID.randomUUID().toString(); // 简化的UUID(32位)
String simpleUUID = uuid.replaceAll("-", "");
七、选型建议与最佳实践 🏆
7.1 方案选择决策树
7.2 最佳实践建议
-
多机房部署:在Snowflake中合理分配datacenterId
-
监控报警:实时监控ID生成器的健康状态
-
压力测试:提前模拟高并发场景下的表现
-
容灾方案:准备备用的ID生成策略
-
定期维护:检查号段消耗和时钟同步状态
八、常见问题解决方案 🛠️
| 问题 | 现象 | 解决方案 |
|---|---|---|
| ID重复 | 不同节点生成相同ID | 检查机器ID配置,确保全局唯一 |
| 性能突然下降 | ID生成速度变慢 | 检查网络延迟,优化号段预加载策略 |
| 时钟回拨 | 生成ID失败 | 启用NTP同步,添加异常处理逻辑 |
| 号段耗尽 | 无法获取新ID | 增加号段长度,优化获取频率 |
| 安全漏洞 | ID被猜测遍历 | 使用Snowflake代替连续自增ID |
相关文章:
零基础掌握分布式ID生成:从理论到实战的完整指南 [特殊字符]
一、为什么需要分布式ID? 🤔 在单机系统中,使用数据库自增ID就能满足需求。但在分布式系统中,多个服务节点同时生成ID时会出现以下问题: ID冲突:不同节点生成相同ID 扩展困难:数据库自增ID无法…...
使用python反射,实现pytest读取yaml并发送请求
pytest yaml yaml - feature: 用户模块story: 登录title: 添加用户request:method: POSTurl: /system/user/listheaders: nullparams: nullvalidate: nullread_yaml_all def read_yaml_all(path):with open(path, r, encodingutf-8) as f:value yaml.safe_load(f)return v…...
点灯、点各式各样的灯
鱼离水则身枯,心离书则神索。 前言闪灯呼吸灯流水灯二进制数显示灯蜂鸣器节拍流水音乐会总结 前言 上回书咱们简单了解了一点有关特殊功能寄存器sfr、通用输入输出GPIO、位操作运算符sbit和一个不靠单片机上的晶振(拿来定时的)的依托于单片机CPU空操作的ms级延时函…...
Matlab 汽车悬架系统动力学建模与仿真
1、内容简介 略 Matlab 170-汽车悬架系统动力学建模与仿真 可以交流、咨询、答疑 2、内容说明 略 本文对题目给定的1/2汽车四自由度模型,建立状态空间模型进行系统分析,并通过MATLAB仿真对系统进行稳定性、可控可观测性分析,对得的结果进行…...
专访数势科技谭李:智能分析 Agent 打通数据平权的最后一公里
作者|斗斗 编辑|皮爷 出品|产业家 伦敦塔桥下的泰晤士河底,埋藏着工业革命的隐秘图腾——布鲁内尔设计的隧道盾构机。在19世纪城市地下轨道建设的过程中,这个直径11米的钢铁巨兽没有选择拓宽河道,而是开创了地下通行的新维度。 “我们不…...
了解浏览器
本文来自腾讯元宝 Chrome浏览器(Google Chrome)是由Google开发的一款免费网页浏览器,自2008年发布以来凭借其高效、安全、简洁的特点成为全球市场份额最高的浏览器。以下是其核心信息及最新动态的综合分析: 一、核心优势与技术特点…...
2、操作系统之软件基础
一、硬件支持系统 ,系统管理硬件 操作系统核心功能可以分为: 守护者:对硬件和软件资源的管理协调者:通过机制,将各种各样的硬件资源适配给软件使用。 所以为了更好的管理硬件,操作系统引进了软件。其中3大…...
STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.15 51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED 前言…...
K8S下nodelocaldns crash问题导致域名请求响应缓慢
前言 最近做项目,有业务出现偶发的部署导致响应很慢的情况,据了解,业务使用域名访问,相同的nginx代理,唯一的区别就是K8S重新部署了。那么问题大概率出现在容器平台,毕竟业务是重启几次正常,偶…...
CVPR2024 | TT3D | 物理世界中可迁移目标性 3D 对抗攻击
Towards Transferable Targeted 3D Adversarial Attack in the Physical World 速览总结摘要-Abstract引言-Introduction相关工作-Related Work方法-MethodologyPreliminray-预备知识问题表述-Problem FormulationNeRF参数空间中的双重优化-Dual Optimization in NeRF Paramete…...
全面对比分析:HDMI、DP、DVI、VGA、Type-C、SDI视频接口特点详解
在当今的多媒体时代,视频接口的选择对于设备连接和显示效果至关重要。不同的视频接口在传输质量、兼容性、带宽等方面各有优劣。本文将全面对比分析常用的视频接口HDMI、DP、DVI、VGA、Type-C、SDI,帮助读者更好地理解它们的特点和适用场景。 一、HDMI&…...
传输层自学
传输实体:完成传输层任务的硬件或软件 可能位于: 操作系统内核独立的用户进程绑定在网络应用中的链接库网络接口卡 1.功能: 网络层与传输层作用范围比较? 网络层负责把数据从源机送达到目的机 传输层负责把数据送达到具体的应…...
使用爬虫获取自定义API操作API接口
1. 引言 在现代Web开发中,API(应用程序接口)是前后端通信的桥梁。通过API,前端可以从后端获取数据,进行各种操作。而爬虫是一种自动化工具,用于从网站上提取数据。本文将详细介绍如何使用爬虫获取自定义AP…...
微服务架构下前端如何配置 OpenAPI 接口
在微服务架构中,后端通常由多个独立的服务组成,每个服务可能提供自己的 API 接口。为了在前端项目中高效地调用这些 API,可以使用 OpenAPI 规范生成客户端代码。以下是详细的配置步骤和最佳实践: 1. 理解 OpenAPI 规范 OpenAPI 是…...
Kotlin知识体系(二) : Kotlin的七个关键特性
前言 在Android开发中,Kotlin以其简洁的语法和强大的特性显著提升了开发效率。本文将解析Kotlin中7个关键特性,通过代码示例展示它们在实际开发中的应用。 一、构造函数:主次分明 主构造函数 class User constructor(_name: String) { //…...
FreeRTOS源码概述
FreeRTOS源码概述 1 FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中,FreeRTOS 相关的源码如下: 主要涉及2个目录: Core Inc 目录下的 FreeRTOSConfig.h 是配置文件Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Mi…...
日志统计(C++,模拟,双指针)
题目要我们求在某个时间段中,帖子点赞数达到K的帖子数 遍历方式一 我们可以先对所有帖子根据时间,升序排序 枚举每一条帖子,枚举后续每一条帖子,如果id相同且时间差小于d,那么就记录起来,如果记录数量cn…...
加固脱壳技术:DEX动态加载对抗
1. 加固技术原理剖析 1.1 DEX保护演进路线 加固方案发展历程: graph LR A[2015 代码混淆] --> B[2017 DEX动态加载] B --> C[2019 VMP指令虚拟化] C --> D[2022 全链路加密] 1.1.1 主流加固方案对比 厂商核心防护技术弱点分析梆梆加固DEX文件分片…...
C++之list类(超详细)
在上一节中我们学习了STL中的vector这个容器,这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…...
强化学习的一些概念
目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习(Reinforcement Learning, RL)是机器学习的一个分支,旨在让智能体(Agent)通过与环境的交互学习最优策略,以…...
MambaTab:表格数据处理的新利器
——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab,一种基于结构化状态空间模型(SSM)的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构,MambaTab在普通监督学习和特征增量学习场景中均表现优异&…...
Kafka的流量控制机制
Kafka的流量控制机制 Kafka 作为一款高吞吐量的消息队列系统,能够在海量数据场景下提供稳定的消息生产和消费能力,其背后的流量控制机制功不可没。我们需要认识到,Kafka 的流量控制并非仅仅是为了防止系统过载或崩溃,它的目标是实…...
RabbitMQ支持的复杂的消息交换模式
RabbitMQ支持多种复杂的消息交换模式,这些模式通过不同的交换机类型和队列特性实现,能够满足多样化的业务需求。以下是RabbitMQ支持的主要复杂消息交换模式: 1. Direct Exchange(直连交换机) 直连交换机根据消息的路由…...
CSSHTML新特性
HTML5 新特性探秘 在 Web 开发的不断演进中,HTML5 带来了一系列令人振奋的新特性,极大地提升了网页的功能和用户体验。今天,我们就来深入探究一下这些新特性。 语义化标签:让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…...
51单片机的工作方式
目录 一、51 单片机的时钟电路及时钟信号 (一)时钟电路 (二)时钟信号 二、51 单片机的CPU 时序 (一)时钟周期 (二)机器周期 (三)指令周期 三、…...
Java算法OJ(12)
目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖,今天来分享几道的练习题,欢迎大家在评论区多多交流,废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目:斐波那契数列_牛客题霸…...
MrRobot靶机详细解答
一、主机发现 arp-scan -l二、端口扫描、目录枚举、指纹识别 2.1端口扫描 nmap -p- 192.168.55.147发现22端口关闭,且无其它特殊端口,只能去网页中寻找信息 2.2目录枚举 dirb http://192.168.55.1472.3指纹识别 nmap 192.168.55.147 -sV -sC -O --…...
java线性表(单向链表)
对于链表我们有很多种,有带头和不带头,双向和单项,循环和不循环。 我们实现的单向链表是不带头单向不循环链表。 链表不比顺序表,它可以连续也可以不连续,是链子型的每条链子两边都有节点(除首尾)。 单向…...
QT:动态属性和对象树
动态对象 1.添加Q_PROPERTY对象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…...
编程语言的几种常见的分类方法
一、 按照编程范式分类 命令式编程语言 强调通过语句来改变程序状态,如 C、Pascal、Fortran 等。 面向对象编程语言 基于对象和类的概念,支持封装、继承和多态,如 Java、C、Python、Ruby 等。 函数式编程语言 注重不可变性和纯函数…...
