分布式ID方案

目录

📊 分布式ID方案核心指标对比

🔍 分方案深度解析

⚙️ 1. UUID (Universally Unique Identifier)

❄️ 2. Snowflake (Twitter开源)

☘️ 3. 美团Leaf

号段模式

Snowflake模式

🔄 4. 百度UidGenerator

🚀 5. CosId

💎 选型建议



📊 分布式ID方案核心指标对比

方案唯一性有序性吞吐量存储空间自治性典型场景
UUID全局唯一完全无序300万/秒128位完全自治会话ID、临时文件
Snowflake全局唯一趋势递增409.6万/秒64位依赖时钟订单ID、日志追踪
美团Leaf全局唯一本地单调递增5万+/秒 (远程)64位弱依赖DB金融交易、高可用系统
百度Uid全局唯一时间趋势递增600万+/秒64位依赖RingBuffer高并发写入场景
CosId全局唯一本地严格递增1.27亿+/秒64位灵活依赖存储分库分表、极致性能需求

🔍 分方案深度解析

⚙️ 1. UUID (Universally Unique Identifier)
  • 原理:基于MAC地址、时间戳、随机数拼接后哈希生成128位标识符(如 123e4567-e89b-12d3-a456-426614174000)。

  • 优点:无中心节点、生成简单、全球唯一。

  • 缺点

    • 长度大:128位存储效率低,数据库索引膨胀;

    • 完全无序:导致数据库插入频繁页分裂,性能骤降;

    • 安全隐患:版本1可能泄露MAC地址。

  • 适用场景:临时令牌、文件命名、非数据库主键场景。

❄️ 2. Snowflake (Twitter开源)
  • 官网:https://github.com/twitter/snowflake
  • 原理:64位ID = 时间戳(41位) + 机器ID(10位) + 序列号(12位),实现本地生成。

  • 优点

    • 趋势递增:利于数据库B+树索引优化;

    • 高性能:单机可达409.6万ID/秒。

  • 致命问题

    • 时钟回拨:服务器时间倒退导致ID重复(需人工干预);

    • 机器ID管理难:动态扩缩容时需保障ID唯一性。

  • 改进方向:Leaf-Snowflake 通过ZK缓存workerId弱依赖。

☘️ 3. 美团Leaf
  • 官网:Leaf:美团分布式ID生成服务开源 - 美团技术团队
  •  源码地址:https://github.com/Meituan-Dianping/Leaf
号段模式
  • 原理:预分配ID段(如[1,1000]),内存分发,异步更新数据库。

  • 优化演进

    • 双Buffer:DB故障时无缝切换备用号段,实现高可用5;

    • 动态Step:根据QPS自动调整号段长度(如QPS↑ → Step×2)。

  • 性能:远程调用QPS 5W+,TP99 <1ms。

Snowflake模式
  • 解决workerId依赖:ZK分配 + 本地缓存,宕机时降级使用历史workerId。

🔄 4. 百度UidGenerator
  • 源码地址:https://github.com/baidu/uid-generator
  • 核心改进

    • RingBuffer预缓存:提前生成ID填充环形队列,并发取号时无锁;

    • 借时机制:当前毫秒序号耗尽时,“借用”未来时间戳继续生成。

  • 局限

    • 默认时间戳仅支持8.7年(41位设计);

    • WorkerId复用策略缺失,扩容受限。

🚀 5. CosId
  • 官网:SegmentId | CosId
  • 源码地址:https://github.com/Ahoo-Wang/CosId

  • 架构创新

    • SegmentChainId:无锁号段链,基于饥饿状态动态扩容安全距离,吞吐达1.27亿/秒;

    • SnowflakeId增强:解决时钟回拨、机器号动态分配、分片不均问题;

  • 多存储支持:JDBC/Redis/ZooKeeper号段分发器,适配不同基础设施。


💎 选型建议

  • 简单轻量 → UUID(非数据库场景);

  • 有序性与性能平衡 → Snowflake/Leaf-Snowflake(需解决时钟问题);

  • 高可用容忍DB故障 → Leaf号段模式(双Buffer容灾);

  • 极致性能需求 → CosId(无锁号段链);

  • 长期运行系统 → 慎用百度Uid(注意时间戳耗尽问题)。

💡 分布式ID的本质是权衡:唯一性、有序性、性能与运维复杂度需结合业务流量、数据库架构及运维能力综合决策。新一代方案如CosId通过架构创新显著提升性能边界,是分库分表等高并发场景的优选

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

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

相关文章

张量类型转换

一.前言本章节我们来讲解张量的类型转换&#xff0c;掌握张量的转换方法&#xff0c;张量的类型转换也是经常使⽤的⼀种操作&#xff0c;是必须掌握的知识点。在本⼩节&#xff0c;我们主要学习如何将 numpy 数组和 PyTorch Tensor 的转化⽅法.二.张量转换为 numpy 数组使⽤ Te…

JavaEE-初阶-多线程初阶

概念第一个多线程程序 可以通过查看jdk路径来找到jdk的控制可以通过jconsole来查看线程。创建线程这是实现多线程的其中一种方法&#xff0c;继承Thread类&#xff0c;实现run方法&#xff0c;之后实例化继承了Thread类的MyThread方法&#xff0c;调用start方法&#xff0c;就会…

解释全连接层的“参数数量”和“计算过程”,保证像看动画片一样直观~

假设场景输入图像&#xff1a;一张极小的 灰度图&#xff08;即 H2,W2&#xff0c;共4个像素&#xff09;&#xff0c;像素值如图所示&#xff1a;隐藏层&#xff1a;假设隐藏层也是 &#xff08;即 H2,W2&#xff0c;共4个神经元&#xff09;&#xff0c;每个神经元用 ( 表示…

DOM编程实例(不重要,可忽略)

文章目录 简介 表格增加删除&#xff0c;效果如下图 样式属性案例 简介 DOM---表格添加删除&#xff0c;样式属性案例 表格增加删除&#xff0c;效果如下图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><met…

​Windows API 介绍及核心函数分类表

Windows API 介绍​ Windows API&#xff08;Application Programming Interface&#xff09;&#xff0c;也称为WinAPI&#xff0c;是微软Windows操作系统的核心编程接口。它提供了一系列函数、消息、数据结构、宏和系统服务&#xff0c;允许开发者创建运行在Windows平台上的应…

Kubernetes Dashboard UI 部署安装

K8S 集群环境&#xff1a; Ubuntu 24 / K8S 1.28.21. 推荐使用helm 安装Kubernetes Dashboardsudo snap install helm --classic2. 部署Kubernetes Dashboard# Add kubernetes-dashboard repository helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboar…

python-enumrate函数

文章目录基本语法基本用法基本遍历指定起始索引实际应用场景需要索引的循环创建字典映射处理文件行号与range(len())对比注意事项enumerate()是Python内置函数&#xff0c;用于在遍历序列&#xff08;如列表、元组或字符串&#xff09;时同时获取索引和值。基本语法 enumerate…

FPGA通信设计十问

1. FFT有什么用&#xff1f;FFT&#xff08;快速傅里叶变换&#xff09;是离散傅里叶变换&#xff08;DFT&#xff09;的高效实现算法&#xff0c;它的核心作用是快速将信号从时域转换到频域&#xff0c;从而简化信号分析和处理的过程。自然界的信号&#xff08;如声音、图像、…

代理模式——Java

代理模式 在Java中代理模式是一种设计模式&#xff0c;是通过代理类来代替原始的对象&#xff0c;可以在不改变原始对象的基础上&#xff0c;对它进行扩展&#xff08;新增一些新功能&#xff09;。在目标方法的执行的执行前后添加一些自定义的方法。 静态代理 步骤&#xff1a…

基于Catboost算法的茶叶数据分析及价格预测系统的设计与实现

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍数据采集数据预处理数据分析与可视化大屏设计模型构建系统展示每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本研究基于京东官网…

【数据库基础 1】MySQL环境部署及基本操作

目录 一、MySQL部署 1.更新软件包列表 2.查看合适的安装包&#xff1a; 3.安装MySQL 4.启动数据库服务并设置开机自启 5.检测MySQL当前状态 6.配置文件修改 二、基本操作指令 1.登陆MySQL 2.创建用户&修改用户密码 3.查看版本 4.退出MySQL 5.停止MySQL 6.数据…

(C++)任务管理系统(正式版)(迭代器)(list列表基础教程)(STL基础知识)

源代码&#xff1a;#include <iostream> #include <list> #include <string>using namespace std;void menu(){cout<<"\n 任务管理系统 "<<endl;cout<<"1.添加普通任务"<<endl;cout<<"2.添加紧急任务…

创建uniapp项目引入uni-id用户体系使用beforeRegister钩子创建默认昵称

需求描述 基于uniCloud开发项目&#xff0c;通常会使用用户体系&#xff0c;uni-id就是基于uniCloud的用户体系&#xff0c;满足常规需要的账号密码注册、登录&#xff0c;微信登录等快捷方式&#xff0c;如果使用uni-id自带的uni-id-pages插件&#xff0c;账号密码注册的话&a…

Opencv---深度学习开发

在OpenCV中进行深度学习开发&#xff0c;主要围绕其dnn模块展开&#xff0c;该模块支持加载预训练模型、预处理输入数据、执行推理计算以及解析输出结果。本文讲解基于OpenCV进行深度学习开发的基本流程。 一、准备工作 在开始开发前&#xff0c;需完成环境配置和资源准备&…

【C++11】右值引用详解

文章目录前言1. 左、右值的概念1.1 左值1.2 右值1.3 右值引用2. 右值引用的价值和使用场景2.1 左值引用的价值和缺陷2.2 右值引用的价值和使用场景2.3 小结3. 完美转发4. 类的移动构造和移动赋值前言 在C11之前&#xff0c;面对C11之前出现的临时对象的传参构造&#xff0c;都…

如何用自指理解世界

自指即自我指涉&#xff0c;即自己的描述关联到了自己&#xff0c;典型例子是“这句话是假话”这个悖论。人类对自指的研究由来已久&#xff0c;很多概念、定理都与之相关&#xff0c;由于它的巧妙性&#xff0c;很多学者对其展开了深入研究&#xff0c;并且认为自指是理解宇宙…

Next.js 实战笔记 2.0:深入 App Router 高阶特性与布局解构

Next.js 实战笔记 2.0&#xff1a;深入 App Router 高阶特性与布局解构 上一篇笔记&#xff1a; Next.js 实战笔记 1.0&#xff1a;架构重构与 App Router 核心机制详解 上篇笔记主要回顾了一些 Next12 到 Next15 的一些变化&#xff0c;这里继续学习/复习一些已有或者是新的…

TCP 传输时 sk_buff 的 clone 和 unclone

周一有位朋友咨询个问题&#xff0c;问题本身不重要&#xff0c;但牵扯出的细节却是非常有趣。 Linux 内核协议栈的 skb 设计非常高效和精巧&#xff0c;多个 skb 可以指向同一块 data&#xff0c;这就是 clone&#xff0c;当 data 不止一个 skb 指示时&#xff0c;任何一个 s…

【51单片机】51单片机学习笔记-课程简介

00. 目录 文章目录00. 目录01. 学习哪种类型的单片机02. 学习单片机方法03. 学习单片机硬件设备04. 学习单片机软件设备05. 学完单片机能做什么06. 附录01. 学习哪种类型的单片机 单片机的型号那么多&#xff0c;该如何选择一款合适的进行学习呢&#xff1f;这里给读者首推的当…

【Docker基础】Docker端口映射(-p参数)深度解析与实践指南

目录 前言 1 Docker网络基础 1.1 Docker网络模型概述 1.2 容器网络隔离性 2 端口映射基础 2.1 端口映射概念 2.2 为什么需要端口映射 3 -p参数详解 3.1 基本语法 3.2 四种映射格式 3.2.1 完整格式 3.2.2 省略宿主机IP 3.2.3 随机宿主机端口 3.2.4 指定协议类型 …