分布式基础(8)-常见分布式ID生成方案

分布式「唯一ID生成器」的几种生成方案 前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID、退款ID等。那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要的。 设计实现一个对外提供产生唯一id的公共服务,要求: 1)每次请求服务器生成的id不会重复; 2)服务应该是高可用的,既不会因为单台服务器的硬件故障(或其他局部原因)而对外停止服务; ... 阅读详情

本文主要参考自相关书籍和网络文章,并附上自身的一些理解,如有遗漏或错误,还望海涵并指出。谢谢!

一.什么是分布式ID

分布式ID即指的是在分布式系统中,全局的唯一标识;分布式ID其实与单机下的ID区别不大,其作用都是起到标识某个订单或数据、消息等,使其在分布式系统中全局唯一。

首先来思考一下,为什么会出现分布式ID呢?单机形式的ID生成方案为什么不能解决分布式ID的问题呢?

假设我们的订单生成服务由两台服务器同时来提供,并且每台机器上生成ID的规则如下:获取当前时间戳和特定序号自增值组合在一起。
在这里插入图片描述

由于请求是并发的,那么服务器1和2生成的时间戳一样,假设为151515(略去许多位),并且请求同时到达数据库,获取到的递增值为23,那么两个服务器都会生成同一个ID,造成冲突。

当然,这个场景是模拟的,只是为了还原一种可能出现分布式ID冲突的情况,可以看出单机的ID生成方案并不用适用于分布式情景下的ID生成,所以出现了许多的方案来解决这个问题。

二.常见分布式ID生成方案

1.UUID

UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。

按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间、时钟序列、全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得)。

UUID的的缺陷在于生成的结果串会比较长并且为字符串形式。

在Java中,可以使用以下方式生成UUID,由于每台服务器的MAC地址和网卡地址肯定是不一样的,所以就算是同一时间生成的ID也会有所不同:

String uuid = UUID.randomUUID().toString();

uuid:f2aca1c1-858b-4cdf-a5b9-999a92414504

2.数据库ID自增

一般主流数据库如Oracle、MySQL都自带表数据主键自增功能,所以我们可以借助数据库来为我们实现全局唯一的ID。

由于分布式数据库的起始自增值一样所以才会有冲突的情况发生,那么我们将分布式系统中数据库的同一个业务表的自增ID设计成不一样的起始值,然后设置固定的步长,步长的值即为分库的数量或分表的数量。

在MySQL中,可以为每台MySQL独自设置自身的初始ID以及递增步长来实现分布式ID的生成:

  • auto_increment_offset:表示自增长字段从那个数开始,他的取值范围是1 … 65535。
  • auto_increment_increment:表示自增长字段每次递增的量,其默认值是1,取值范围是1 … 65535。

假设有三台机器,则DB1中order表的起始ID值为1,DB2中order表的起始值为2,DB3中order表的起始值为3,它们自增的步长都为3,则它们的ID生成范围如下图所示,可以看出每个数据库生成的ID都不同。

在这里插入图片描述

使用数据库生成ID的方式可以保证ID的唯一性,并且实现起来也很简单,但是由于数据库只能做到数字自增,但是普通的数字是不适合做一些业务的ID的,譬如订单号,不能用23、24、25这种形式来标识,因为规律性太强并且从其中不能够解析出其他更有用的数据了(譬如时间戳之类)。

但是数据库自增ID很适合做主键物理ID,而业务逻辑ID应该选择其他方式来生成。

3.Redis

现在来说说Redis生成唯一ID的方案。

我们可以借助Redis的incr或incrby命令的原子特性来获取全局递增的序列号,来构建分布式ID:

GID = 时间戳 + 机器号 + 全局自增的Redis序列号

在这里插入图片描述

这种做法需要额外借助Redis服务来实现,并且需要保证Redis的可用性,如果Redis不可用的话(网络问题、宕机等)那么也会导致ID生成失败。

4.Snowflake-雪花算法

说到分布式ID生成方案就不得不提大名鼎鼎的Snowflake-雪花算法。

雪花算法是推特为了解决分布式ID问题而研发出的一种方法,主要的思路与UUID的思路一致,不同的是雪花算法会算得一个64位的Long型ID,而不是一条字符串。

在这里插入图片描述

  1. 第1bit不使用,默认为0,因为在许多语言中Long的最高位都只用以表示为符号为,这里默认生成的ID为正值。除开高位的1bit外的63bit全部都需要使用。
  2. 前41bit表示毫秒级的时间戳,这个时间戳指的是差值时间戳,而不是时刻时间戳。41bit能表达的数字范围为0 ~ 2^ 41个,所以能够表达2^ 41毫秒也就是69年。所以一个由雪花算法生成的ID,最长能够保证69年内不出现重复的,因为在2^ 41毫秒之后,时间戳会重新将差值置为0,开始出现重复。
  3. 中间10bit用以表示机器ID,最多可以容纳2^ 10也就是1024台机器组成。还可以将着10bit划分为:5bit表示数据中心,5bit表示机器ID。
  4. 后12bit用以表示自增序列号,12bit最多可表示2^ 12 = 4096个数。

所以在极限情况下,假设我们有1024台机器,在1毫秒之内我们可以生成的全局ID有:

1024 * 4096 = 400万

在1s中之内可以生成的ID有:

1024 * 4096 * 1000 = 40亿

所以在不考虑机器性能的情况下,通过雪花算法,1毫秒可以获取到400万个不重复的ID,1秒可以获取40亿个ID,这是一个十分可观的数字。但是实测来说,单机的机器1秒钟大概可以生成30万个ID。

具体的代码实现以及性能测试可以参考这两篇文章:

  • http://www.machengyu.net/tech/2019/12/04/snowflake.html
  • https://yq.aliyun.com/articles/713964
5.其他:Leaf和UidGenerator

Leaf和UidGenerator分别由美团与百度研发,其原理与雪花算法类似,不过提供了更多的可选项和自定义操作,这里就不再详细说明了。

三.总结

  1. UUID:实现简单,不需要网络,可以在本地生成全局唯一ID。但是生成的ID为字符串类型,并且长度较长。
  2. 数据库ID自增:实现简单,需要与数据库连接,但是生成的ID只能为简单的数字,不适合做业务ID。
  3. Redis:需要外加Redis服务,成本较高,需要设置好Redis以提供高可用服务。但是容易定制和拓展。
  4. 雪花算法:需要网络(要借助zk来注册自增序号),效率高,可生成Long型ID,理论上一个ID可有69年的过期时间以及1毫秒内最多可并行生成400万个ID。
分布式ID生成方案-snowflake算法 背景 在互联网的业务系统中,涉及到各种各样的ID,这些ID需要保证全局唯一。我们称之为分布式ID,分布式ID需要满足 唯一性、趋势递增性、高可用性、高性能等特点。 snowflake算法,也叫雪花算法,是其中的一种分布式ID生成方案。是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器。 讲解雪花算法前,我们先概述一下分布式ID有哪些生成方案。 分布式ID生成方案 分布式ID有以下几种生成方式: UUID 算法的核心思想是结合 阅读详情

相关推荐

芯片设计新手必看:5分钟搞懂工艺角(Process Corner)到底是什么,为啥仿真总要用它?

本文详细解析了芯片设计中的工艺角(Process Corner)概念及其在仿真中的重要性。通过类比马拉松运动员的性能差异,解释了晶体管制造过程中的天然波动,并介绍了TT/FF/SS等工艺角代码的含义。文章还探讨了为何需要跑全工艺角仿真,以及现代芯片验证的完整流程,包括PVT矩阵和多模式分析(MMMC),帮助芯片设计新手快速掌握这一关键概念。

weixin_28713947的博客 246

九种分布式ID生成方式

一、为什么要用分布式ID? 1、什么是分布式ID? 2、那么分布式ID需要满足那些条件? 二、 分布式ID都有哪些生成方式? 1、基于UUID 2、基于数据库自增ID 3、基于数据库集群模式 4、基于数据库的号段模式 5、基于Redis模式 6、基于雪花算法(Snowflake)模式 7、百度(uid-generator) Snowflake算法 CachedUidGenerator 吞吐量测试 8、美团(Leaf) 9、滴滴(Tinyid) 性能与可用性 Tinyid的特

过往很淡的博客 800

带你一分钟了解电感与磁珠的区别

在电路设计中会经常使用到电感和磁珠,虽然在电路中的作用有所不同,但它们都属于磁性电子元器件,本文简单介绍下电感和磁珠的区别电感和磁珠电感和磁珠的结构主要由磁性材料金属线圈和外壳组成,具体结构如下图所示:电感磁珠结构图电感其实是金属线圈缠绕在磁芯上,而磁珠是在内部折叠后外围包裹着铁氧体磁性材料。电感器(Inductor)又称扼流器、电抗器、动态电抗器是储能器件,能够把电能转化为磁能而存储起来的元件。磁珠则是能量转换(消耗)器件,将流过他的高频信号以热能的形式消耗掉。

攻城狮鹏哥 1410

分布式ID生成 - 雪花算法

雪花算法是一种生成分布式全局唯一ID的经典算法,关于雪花算法的解读网上多如牛毛,大多抄来抄去,这里请参考耕耘的小象大神的博客ID生成器,Twitter的雪花算法(Java) 网上的教程一般存在两个问题: 1. 机器ID(5位)和数据中心ID(5位)配置没有解决,分布式部署的时候会使用相同的配置,任然有ID重复的风险。 2. 使用的时候需要实例化对象,没有形成开箱即用的工具类。 本文针对上面...

阿凯的专栏 3万+

2D Nesting Defining a CSV File of Part Data

若。

qq_36560674的博客 1855

扩散模型中的UNET

一、为什么UNET模型可以用于去噪网络 二、扩散模型中的UNET是一个条件去噪网络,怎么实现的 三、UNET用于分割和用去去噪的区别

m0_37737957的博客 3819

分布式架构系统生成全局唯一序列号的一个思路

为什么80%的码农都做不了架构师?>>> ...

weixin_33849942的博客 1158

学Simulink——基于高渗透率可再生能源微电网的逆变器系统场景实例:含高比例逆变型电源的微电网暂态稳定性分析

本文详细介绍了基于MATLAB/Simulink的高渗透率可再生能源微电网建模方法,重点分析含高比例逆变型电源的微电网暂态稳定性问题。通过构建包含光伏、风电、逆变器和电网等模块的系统模型,展示了从项目创建、模块搭建到控制策略实现的完整过程。文章特别提供了逆变器PQ控制算法和故障处理逻辑的代码示例,并介绍了仿真参数设置与结果分析方法。该模型能有效评估微电网在故障条件下的动态响应特性,为优化逆变器控制策略提供依据,对现代智能电网研究具有重要意义。

xiaoheshang_123的博客 141

9种 分布式ID生成方式

号段模式是当下分布式ID生成器的主流实现方式之一,号段模式可以理解为从数据库批量的获取自增ID,每次从数据库取出一个号段范围,例如 (1,1000] 代表1000个ID,具体的业务服务将本号段,生成1~1000的自增ID并加载到内存。根据这个算法的逻辑,只需要将这个算法用Java语言实现出来,封装为一个工具方法,那么各个业务应用可以直接使用该工具方法来获取分布式ID,只需保证每个业务应用有自己的工作机器id即可,而不需要单独去搭建一个获取分布式ID的应用。特别一点的如订单、优惠券也都需要有。

z_ssyy的博客 642

【IxNetwork】史上最全IxNetwork测试仪使用精讲(一),图文教程超赞超详细!!!

IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试;

风云说通信 2058

【教程4>第4章>第12节】通过FPGA实现基于FFT变换的频偏估计和补偿

基于FFT变换的频偏估计和补偿,其基本原理如下:而频偏补偿的目的是将频偏后的信号频谱移回原来的位置。

FPGA/MATLAB学习教程/源码/项目合作开发 882

分布式系统全局唯一ID简介、特点、生成

一、什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。 如在金融、电商、支付、等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求,此时一个能够生成全局唯一ID的系统是非常必要的。 二、分布式系统唯一ID的特点 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。 趋势递增:在M...

cowbin2012的专栏 1万+

【GitHub项目实战】OpenAvatarChat 搭建实时交互数字人

OpenAvatarChat 项目构建了一个集成语音识别、大语言模型、语音合成、表情驱动和实时通信于一体的虚拟人系统,具备本地优先、模块解耦、快速部署的特点。系统通过配置文件统一管理组件,支持多种组合方案,适用于低资源设备和私有化部署场景。配置逻辑清晰、模块职责明确,能快速启动并实现端到端语音交互流程,为多模态系统学习与实践提供了结构完整的工程参考。

Mr数据杨 2755

常见分布式ID生成方案

文章目录一、为什么要用分布式ID1、什么是分布式ID2、那么分布式ID需要满足哪些条件二、 分布式ID有哪些生成方式1、基于UUID2、基于数据库自增ID3、基于数据库集群模式4、基于数据库的号段模式5、基于Redis模式6、基于雪花算法(Snowflake)模式7、百度(uid-generator)8、美团(Leaf)号段模式snowflake模式9、滴滴(Tinyid)Http方式接入Java客户端方式接入三、总结 一、为什么要用分布式ID 在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式

ThinkWon的博客 8289

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最全常见分布式ID生成方案

近两年的技术面试,分布式系列问题是面试官经常会问到的一个高频方向。比如:分布式事务、分布式锁、分布式调度、分布式存储、分布式 ID、分布式集群等。今天我们就来聊聊,这里面相对简单的分布式 ID。

mzhlqy的博客 2487

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

分布式ID生成方案总结

分布式场景下,由于通常是分库分表,所以通常无法仅仅使用数据库的自增Id。需要使用其他方案生成唯一的id。目前业界主流的是基于雪花算法或者雪花算法的改进版本。

Lemon 2798

生成分布式ID的几种常见方案

一、背景为什么要用分布式ID?分布式ID应该满足哪些特征?1、什么是分布式ID拿MySQL数据库举个例子:在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也ok。但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。

乡村非主流2020的博客 1734

分布式系统中分布式ID生成方案的技术详解

选择合适的分布式ID生成方案需要综合考虑系统的规模、性能需求、ID的顺序性和唯一性要求以及对网络的依赖程度。不同的方案各有优缺点和适用场景,在实际应用中需要根据具体情况进行权衡和选择。通过合理使用分布式ID生成方案,可以确保分布式系统中数据的唯一性和一致性,提高系统的可靠性和性能。

huangxuanxuan01的博客 3788

【分布式】分布式唯一 ID 的 8 种生成方案

在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID、退款ID等。那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十分重要的。下面我们一一来列举一下,不一定全部适合,这些解决方案仅供你参考,或许对你有用。image.png。

DreamSun的博客 1554

分布式ID详解(5种分布式ID生成方案)

分布式架构会涉及到分布式全局唯一ID的生成,今天我就来详解分布式全局唯一ID,以及分布式全局唯一ID的实现方案@mikechen

mikechen的互联网架构 1万+

聊聊常见的分布式ID解决方案

highlight: xcode theme: vuepress 为什么要使用分布式ID? 随着 Web 开发技术的不断发展,单体的系统逐步走向分布式系统。在分布式系统中,使用分布式 ID(Distributed IDs)主要是为了在没有单点故障的情况下生成唯一标识符。这些唯一标识符在很多场景中非常重要,例如数据库记录的主键、消息队列中的消息ID、日志系统中的唯一事件ID等。使用分布式 ...

weixin_45254062的博客 1339

《伸手系列》之分布式ID生成解决方案

一、为什么要用分布式ID? 1. 什么情况下我们需要ID生成器 数据库水平拆分的情况下,主键由于需要作为业务标识使用,需要唯一。 业务编号需要暴露给用户,但是又不想被用户猜到需要被隐藏的业务编号 业务编号需要体现业务信息,比如订单分类订单渠道等等 拿MySQL数据库举个栗子: 在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。 但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据

御前提笔小书童 1615

生成分布式ID的四种常见方案对比

这篇博客从零开始,介绍了分布式id的使用场景和重要性,并且列举了目前最常见的分布式id生成方法。包括 UUID、单独自增主键、雪花算法、Redis的incr命令等。

不会骑摩托的程序员不是好的摄影师 1217

8种分布式ID生成方案汇总

对于单体系统来说,主键ID可能会常用主键自动的方式进行设置,这种ID生成方法在单体项目是可行的,但是对于分布式系统,分库分表之后,就不适应了,比如订单表数据量太大了,分成了多个库,如果还采用数据库主键自增的方式,就会出现在不同库id一致的情况,虽然是不符合业务的。

Wewe的博客 1106
上一篇: 分布式基础-常见分布式事务解决方案
下一篇: Linux Bash Shell 快速上手 - 上篇
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值