零基础掌握分布式ID生成:从理论到实战的完整指南 [特殊字符]

news2025/3/17 6:00:55

一、为什么需要分布式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;    // 数据中心ID
    private final long workerId;       // 机器ID
    private 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 解决时钟回拨问题

  1. NTP时间同步:使用网络时间协议同步服务器时间

  2. 异常检测:在代码中增加时钟回拨检测逻辑

  3. 备用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 最佳实践建议

  1. 多机房部署:在Snowflake中合理分配datacenterId

  2. 监控报警:实时监控ID生成器的健康状态

  3. 压力测试:提前模拟高并发场景下的表现

  4. 容灾方案:准备备用的ID生成策略

  5. 定期维护:检查号段消耗和时钟同步状态


八、常见问题解决方案 🛠️

问题现象解决方案
ID重复不同节点生成相同ID检查机器ID配置,确保全局唯一
性能突然下降ID生成速度变慢检查网络延迟,优化号段预加载策略
时钟回拨生成ID失败启用NTP同步,添加异常处理逻辑
号段耗尽无法获取新ID增加号段长度,优化获取频率
安全漏洞ID被猜测遍历使用Snowflake代替连续自增ID

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2316440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用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…

Matlab 汽车悬架系统动力学建模与仿真

1、内容简介 略 Matlab 170-汽车悬架系统动力学建模与仿真 可以交流、咨询、答疑 2、内容说明 略 本文对题目给定的1/2汽车四自由度模型&#xff0c;建立状态空间模型进行系统分析&#xff0c;并通过MATLAB仿真对系统进行稳定性、可控可观测性分析&#xff0c;对得的结果进行…

专访数势科技谭李:智能分析 Agent 打通数据平权的最后一公里

作者|斗斗 编辑|皮爷 出品|产业家 伦敦塔桥下的泰晤士河底&#xff0c;埋藏着工业革命的隐秘图腾——布鲁内尔设计的隧道盾构机。在19世纪城市地下轨道建设的过程中&#xff0c;这个直径11米的钢铁巨兽没有选择拓宽河道&#xff0c;而是开创了地下通行的新维度。 “我们不…

2、操作系统之软件基础

一、硬件支持系统 &#xff0c;系统管理硬件 操作系统核心功能可以分为&#xff1a; 守护者&#xff1a;对硬件和软件资源的管理协调者&#xff1a;通过机制&#xff0c;将各种各样的硬件资源适配给软件使用。 所以为了更好的管理硬件&#xff0c;操作系统引进了软件。其中3大…

STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.15 51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED 前言…

K8S下nodelocaldns crash问题导致域名请求响应缓慢

前言 最近做项目&#xff0c;有业务出现偶发的部署导致响应很慢的情况&#xff0c;据了解&#xff0c;业务使用域名访问&#xff0c;相同的nginx代理&#xff0c;唯一的区别就是K8S重新部署了。那么问题大概率出现在容器平台&#xff0c;毕竟业务是重启几次正常&#xff0c;偶…

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视频接口特点详解

在当今的多媒体时代&#xff0c;视频接口的选择对于设备连接和显示效果至关重要。不同的视频接口在传输质量、兼容性、带宽等方面各有优劣。本文将全面对比分析常用的视频接口HDMI、DP、DVI、VGA、Type-C、SDI&#xff0c;帮助读者更好地理解它们的特点和适用场景。 一、HDMI&…

传输层自学

传输实体&#xff1a;完成传输层任务的硬件或软件 可能位于&#xff1a; 操作系统内核独立的用户进程绑定在网络应用中的链接库网络接口卡 1.功能&#xff1a; 网络层与传输层作用范围比较&#xff1f; 网络层负责把数据从源机送达到目的机 传输层负责把数据送达到具体的应…

微服务架构下前端如何配置 OpenAPI 接口

在微服务架构中&#xff0c;后端通常由多个独立的服务组成&#xff0c;每个服务可能提供自己的 API 接口。为了在前端项目中高效地调用这些 API&#xff0c;可以使用 OpenAPI 规范生成客户端代码。以下是详细的配置步骤和最佳实践&#xff1a; 1. 理解 OpenAPI 规范 OpenAPI 是…

FreeRTOS源码概述

FreeRTOS源码概述 1 FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中&#xff0c;FreeRTOS 相关的源码如下&#xff1a; 主要涉及2个目录&#xff1a; Core Inc 目录下的 FreeRTOSConfig.h 是配置文件Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Mi…

日志统计(C++,模拟,双指针)

题目要我们求在某个时间段中&#xff0c;帖子点赞数达到K的帖子数 遍历方式一 我们可以先对所有帖子根据时间&#xff0c;升序排序 枚举每一条帖子&#xff0c;枚举后续每一条帖子&#xff0c;如果id相同且时间差小于d&#xff0c;那么就记录起来&#xff0c;如果记录数量cn…

加固脱壳技术:DEX动态加载对抗

1. 加固技术原理剖析 1.1 DEX保护演进路线 加固方案发展历程&#xff1a; graph LR A[2015 代码混淆] --> B[2017 DEX动态加载] B --> C[2019 VMP指令虚拟化] C --> D[2022 全链路加密] 1.1.1 主流加固方案对比 厂商核心防护技术弱点分析梆梆加固DEX文件分片…

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器&#xff0c;这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…

强化学习的一些概念

目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个分支&#xff0c;旨在让智能体&#xff08;Agent&#xff09;通过与环境的交互学习最优策略&#xff0c;以…

MambaTab:表格数据处理的新利器

——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab&#xff0c;一种基于结构化状态空间模型&#xff08;SSM&#xff09;的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构&#xff0c;MambaTab在普通监督学习和特征增量学习场景中均表现优异&…

Kafka的流量控制机制

Kafka的流量控制机制 Kafka 作为一款高吞吐量的消息队列系统&#xff0c;能够在海量数据场景下提供稳定的消息生产和消费能力&#xff0c;其背后的流量控制机制功不可没。我们需要认识到&#xff0c;Kafka 的流量控制并非仅仅是为了防止系统过载或崩溃&#xff0c;它的目标是实…

CSSHTML新特性

HTML5 新特性探秘 在 Web 开发的不断演进中&#xff0c;HTML5 带来了一系列令人振奋的新特性&#xff0c;极大地提升了网页的功能和用户体验。今天&#xff0c;我们就来深入探究一下这些新特性。 语义化标签&#xff1a;让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…

51单片机的工作方式

目录 一、51 单片机的时钟电路及时钟信号 &#xff08;一&#xff09;时钟电路 &#xff08;二&#xff09;时钟信号 二、51 单片机的CPU 时序 &#xff08;一&#xff09;时钟周期​ &#xff08;二&#xff09;机器周期​ &#xff08;三&#xff09;指令周期​ 三、…

Java算法OJ(12)

目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道的练习题&#xff0c;欢迎大家在评论区多多交流&#xff0c;废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目&#xff1a;斐波那契数列_牛客题霸…