当前位置: 首页 > news >正文

分布式ID 与自增区别

分布式ID与自增ID的深度对比

一、核心特性对比

特性自增ID分布式ID
生成方式数据库序列/表锁算法生成(雪花算法、UUID等)
连续性严格连续通常不连续(除特殊设计)
可预测性高度可预测不可预测(安全特性)
生成位置集中式存储生成分布式节点本地生成

二、架构影响分析

自增ID的架构限制

图表

代码

  • 瓶颈:所有应用实例竞争同一数据源获取ID

  • 扩展问题:水平扩展时需考虑分库分表后的ID冲突

分布式ID的架构优势

图表

代码

  • 无竞争:各节点独立生成ID

  • 无限扩展:理论上只要算法允许可无限扩展节点

三、性能指标对比

指标自增ID分布式ID
QPS上限约5万(MySQL)100万+
网络延迟影响严重依赖无依赖
数据库负载
生成耗时(平均)1-5ms0.01-0.1ms

四、典型实现方案

自增ID实现

sql

-- MySQL实现
CREATE TABLE users (id BIGINT AUTO_INCREMENT PRIMARY KEY
);-- PostgreSQL序列
CREATE SEQUENCE user_id_seq;
CREATE TABLE users (id BIGINT DEFAULT nextval('user_id_seq') PRIMARY KEY
);

分布式ID实现

雪花算法(Snowflake)示例

java

public class SnowflakeIdGenerator {private final long datacenterId;private final long machineId;private long sequence = 0L;private long lastTimestamp = -1L;public synchronized long nextId() {long timestamp = System.currentTimeMillis();if (timestamp < lastTimestamp) {throw new RuntimeException("时钟回拨异常");}if (timestamp == lastTimestamp) {sequence = (sequence + 1) & 0xFFF;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - 1288834974657L) << 22) | (datacenterId << 17) | (machineId << 12) | sequence;}
}

五、业务场景选择指南

适合自增ID的场景

  1. 单体架构应用

  2. 需要严格递增的审计场景

  3. 简单查询优化需求(如 WHERE id > 1000)

  4. 与ORM框架深度集成的项目

适合分布式ID的场景

  1. 微服务架构系统

  2. 高并发写入需求(如电商下单)

  3. 需要隐藏业务量的场景(安全考虑)

  4. 多数据中心部署

六、特殊问题处理

自增ID的分库分表问题

sql

-- 采用分段分配策略
-- 实例1分配1-100万
-- 实例2分配100万-200万
ALTER TABLE users AUTO_INCREMENT=1000000;

分布式ID的时钟回拨解决方案

  1. 短暂回拨:等待时钟同步

  2. 严重回拨

    java

    // 备用生成器方案
    if (clockDrift > THRESHOLD) {return backupGenerator.nextId();
    }
  3. 无时钟依赖方案

    java

    // 使用递增计数器+机器ID
    atomicCounter.incrementAndGet() | (machineId << 48)

七、混合方案实践

ID组合模式

text

[类型前缀(2位)][时间戳(32位)][自增序列(20位)][机器ID(10位)]

示例实现:

python

def generate_id():type_prefix = 0x01  # 业务类型编码timestamp = int(time.time() * 1000)sequence = redis.incr('id_sequence') & 0xFFFFFmachine_id = 0x3FF & get_machine_ip_hash()return (type_prefix << 62) | (timestamp << 20) | sequence | machine_id

根据业务需求合理选择ID生成策略,在分布式环境下通常优先考虑分布式ID方案,但在特定场景下自增ID仍具有不可替代的优势。

http://www.dtcms.com/a/271850.html

相关文章:

  • 虚拟储能与分布式光伏协同优化:新型电力系统的灵活性解决方案
  • 异步I/O库:libuv、libev、libevent与libeio
  • 从0到1:Python与DeepSeek的深度融合指南
  • jupyter 和 kernel 之间的关系
  • .net服务器Kestrel 与反向代理
  • 【TCP/IP】11. IP 组播
  • 【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(六)
  • 【博主亲测可用】PS2025最新版:Adobe Photoshop 2025 v26.8.1 激活版(附安装教程)
  • Apache Dubbo实战:JavaSDK使用
  • 前端面试十一之TS
  • 服务器重装后如何“复活”旧硬盘上的 Anaconda 环境?—— 一次完整的排错与恢复记录
  • 计算机学科专业基础综合(408)四门核心课程的知识点总结
  • 微信小程序101~110
  • 以太网基础⑤UDP 协议原理与 FPGA 实现
  • 2025年7月9日学习笔记——模式识别与机器学习——fisher线性回归、感知器、最小二乘法、最小误差判别算法、罗杰斯特回归算法——线性分类器
  • 【TCP/IP】1. 概述
  • AI赋能生活:深度解析与技术洞察
  • LiteHub之文件下载与视频播放
  • 微信小程序控制空调之EMQX服务器安装与配置
  • 重新配置电脑中的环境变量
  • SpringBoot ThreadLocal 全局动态变量设置
  • 机器学习11——支持向量机上
  • 初学者对编译和链接的学习笔记(含预编译详解)
  • 广告匹配策略的智能化之路:人工智能大模型的方法和步骤
  • 多模态大语言模型arxiv论文略读(156)
  • vivo Pulsar 万亿级消息处理实践(3)-KoP指标异常修复
  • 快速上手MongoDB与.NET/C#整合
  • 【AI大模型】LLM模型架构深度解析:BERT vs. GPT vs. T5
  • searxng 对接openweb-UI实现大模型通过国内搜索引擎在线搜索
  • 搜索引擎vs向量数据库:LangChain混合检索架构实战解析