分布式ID生成方案总结

news/2024/5/12 6:19:03

分布式场景下,需要保证每一个服务拿到的id是唯一的。本文讨论、分析、总结了一些常见的分布式ID生成方案
结论:技术上没有银弹,每种分布式id都有自己的使用场景。uuid适用于业务比较简单,对性能没有太高追求等。 目前主流是 基于数据库的号段模式,雪花算法、以及雪花算法的改进版本。

分布式ID需要满足哪些条件?有什么要求?

  • 全局唯一。不能重复。(核心)
  • 趋势递增。
  • 信息安全。(id是连续的,容易被恶意用户爬取数据)
  • 高性能。低延迟等性能要求。

UUID

UUID全程是 Universally Unique Identifier。字面意思:全球唯一的标识。 UUID 是一种由标准化的算法生成的 128 位数字,它在理论上是全球唯一的。UUID 可以通过不同的算法生成,其中最常见的是基于时间戳和节点信息生成的版本 1 UUID 和基于随机数生成的版本 4 UUID。

有什么特点?

  • 足够的简单,java原生自带。本地生成具有唯一性。
  • 缺点:不是自增的。不具备趋势递增性。没有具体的业务含义。长度比较大,浪费空间。

基于数据库

使用一个单独的数据库实例去生成。访问量剧增,mysql本身就是瓶颈。单点风险。

数据库集群。

多个db。使用不常。这样就可以确保每一个db生成的都是不重复的。
比如3个db实例,db1 从1开始生成,每次自增3。db2从2,每次自增3。这样就能保证唯一性。

  • 致命缺点:不利于后续扩容(几乎很少去使用)

基于数据库的号段模式(重点)

号段模式是当下分布式ID生成器的主流实现方式之一,号段模式可以理解为从数据库批量的获取自增ID,每次从数据库取出一个号段范围,例如 (1,1000] 代表1000个ID,具体的业务服务将本号段,生成1~1000的自增ID并加载到内存。表结构如下:

CREATE TABLE id_generator (id int(10) NOT NULL,max_id bigint(20) NOT NULL COMMENT '当前最大id',step int(20) NOT NULL COMMENT '号段的步长',biz_type	int(20) NOT NULL COMMENT '业务类型',version int(20) NOT NULL COMMENT '版本号',PRIMARY KEY (`id`)
) 

biz_type :代表不同业务类型

max_id :当前最大的可用id

step :代表号段的长度

version :是一个乐观锁,每次都更新version,保证并发时数据的正确性

等这批号段ID用完,再次向数据库申请新号段,对max_id字段做一次update操作,update max_id= max_id + step,update成功则说明新号段获取成功,新的号段范围是(max_id ,max_id +step]。

update id_generator set max_id = #{max_id+step}, version = version + 1 where version = # {version} and biz_type = XXX

由于多业务端可能同时操作,所以采用版本号version乐观锁方式更新,这种分布式ID生成方式不强依赖于数据库,不会频繁的访问数据库,对数据库的压力小很多。

雪花算法

雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f9612d58776d48d4bb26e60d9e036ff0.png
Snowflake生成的是Long类型的ID,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特。

Snowflake ID组成结构:正数位(占1比特)+ 时间戳(占41比特)+ 机器ID(占5比特)+ 数据中心(占5比特)+ 自增值(占12比特),总共64比特组成的一个Long类型。

第一个bit位(1bit):Java中long的最高位是符号位代表正负,正数是0,负数是1,一般生成ID都为正数,所以默认为0。
时间戳部分(41bit):毫秒级的时间,不建议存当前时间戳,而是用(当前时间戳 - 固定开始时间戳)的差值,可以使产生的ID从更小的值开始;41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年
工作机器id(10bit):也被叫做workId,这个可以灵活配置,机房或者机器号组合都可以。
序列号部分(12bit),自增值支持同一毫秒内同一个节点可以生成4096个ID
根据这个算法的逻辑,只需要将这个算法用Java语言实现出来,封装为一个工具方法,那么各个业务应用可以直接使用该工具方法来获取分布式ID,只需保证每个业务应用有自己的工作机器id即可,而不需要单独去搭建一个获取分布式ID的应用。
nowFlake可以保证:
优缺点:

  • 同一台服务器所有生成的id按时间趋势递增
    整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)
    存在的问题:
  • 机器ID(5位)和数据中心ID(5位)配置没有解决,分布式部署的时候会使用相同的配置,任然有ID重复的风险。
  • 使用的时候需要实例化对象,没有形成开箱即用的工具类。
  • 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。(这点在正常情况下是不会发生的)

作者:程序员内点事 链接:
https://juejin.im/post/5e48a9af6fb9a07cc200c203
来源:掘金


http://www.mrgr.cn/p/85553600

相关文章

HCIP—BGP路由发布

R1和R2&#xff0c;R4和R5建立EBGP对等体 R1和R2&#xff08;R4和R5&#xff09;之间属于EBGP对等体&#xff0c;可以使用直连物理接口建立对等体关系&#xff0c;TTL值默认1。由于使用直连物理接口方式建立&#xff0c;刚好一跳到达。 [R1]bgp 100 [R1-bgp]router-i…

RestFul风格的开发

Representational State Transfer;get查询,post新增,put更新,delete删除1、REST风格根据REST风格对资源进行访问称为restful 描述模块通常使用复数表示某类资源每个控制器方法前都有这两个注解:@RequestMapping(value = "/users/{id}/{name}",method = RequestM…

苹果App Store上架工具介绍

文章目录 摘要引言正文1. Xcode2. [appuploder](https://www.applicationloader.net/)3. [克魔助手](https://keymob.com/) 4.[ipa guard](https://www.ipaguard.com/)总结参考资料 摘要 苹果App Store作为iOS应用程序的主要分发渠道&#xff0c;上架应用程序需要遵守规定和通…

【MySQL系列】--基础知识1:事务与隔离

1、MySQL:基础知识之事务与隔离

以智慧公厕建设助推城市的高质量发展

近年来&#xff0c;随着城市化进程的加快&#xff0c;城市基础设施建设日益完善&#xff0c;其中智慧公厕的建设成为了城市高质量发展的重要组成部分。智慧公厕以其智能化管理、数字化使用和信息化运行的特点&#xff0c;将公共厕所的管理水平提升到了一个全新的高度&#xff0…

Fiddler(5)Statistics数据统计面板性能分析,Inspectors查看请求与响应

Statistics数据统计面板,性能分析 重点:主要关注RTT,体现一个请求从发送到返回响应的时间反映一个请求的性能指标,其中主要需要关注RTT 会展示全世界范围的请求平均数据 show chart按钮,从饼状图中分别出哪些资源的请求耗时最多,从而对页面的访问进行访问速度优化Inspect…

Camera基础知识

camera模组组成:保护膜:适用于对与镜头的保护,防止镜头出现灰尘或者污渍,以及防止镜头镜片出现划痕。 镜头:主要作用是聚集光线,并将光线折射到传感器上 马达(VCM):通过移动镜头来实现光学变焦 IR滤光片:人眼感测器只能检测到波长介于400nm至700nm之间的可见光,IR滤…

畅捷通T+ Ufida.T.DI.UIP.RRA.RRATableController 远程命令执行漏洞

一、漏洞信息 漏洞名称&#xff1a;畅捷通T Ufida.T.DI.UIP.RRA.RRATableController 远程命令执行漏洞 漏洞类别&#xff1a;远程命令执行漏洞 风险等级&#xff1a;高危 二、漏洞描述 畅捷通TPlus适用于异地多组织、多机构对企业财务汇总的管理需求&#xff1b;全面支持企…

Autosar-CanNm、Nm配置详解(免费)-1

3.1由DBC创建Nm、CanNM ETAS工具可根据DBC文件&#xff0c;自动配置生成Nm、CanNm模块。但是关键的一点是要生成NM、CanNM模块DBC文件中必须有NM类型的报文。 还有一点&#xff0c;即使DBC文件中有Nm的报文&#xff0c;但是因为报文的类型在导入时没有设置成Nm&#xff0c;那也…

数据分析能力模型分析与展示

具体内容&#xff1a; 专业素质 专业素质-01 数据处理 能力定义•能通过各种数据处理工具及数据处理方法&#xff0c;对内外部海量数据进行清洗和运用&#xff0c;提供统一数据标准&#xff0c;为业务分析做好数据支持工作。 L1•掌握一…

HTML 简介

​HTML(HyperText Markup Language,中文:超文本标记语言)是一种用于创建网页结构和内容的标记语言。它由一系列标签组成,这些标签描述了网页中的各个元素和其它相关信息。通过使用HTML标签和属性,开发人员可以定义文本、图像、链接、表格、表单等元素,并控制它们的外观和…

springboot关于注册条件相关内容

核心注解为@Condition//如果配置文件中存在了指定信息,才会注入,否则不注入 @ConditionalOnProperty(prefix = "country",name={"name","system"})此时因为配置文件中没有指定信息,所以没有注入到ioc池中,Country country = context.getBean…

m基于深度学习网络的中药识别系统matlab仿真,包含GUI界面

1.算法仿真效果 matlab2022a仿真结果如下: 2.算法涉及理论知识概要中药识别是中医药领域中的一项重要任务,对于确保药品质量、保障用药安全具有重要意义。传统的中药识别方法主要依赖人工经验和形态特征,但存在主观性强、效率低下等问题。近年来,深度学习在图像识别领域取得…

Jupyter R绘图 汉字显示乱码的解决办法

1.Jupyte中&#xff0c;R绘图&#xff0c;汉字显示乱码 2.如何解决&#xff1f; (1)R中安装showtext 登录linux服务器 #R > install.packages(“showtext”) … 出错 (2)退出R,安装freetype-config #apt install libfreetype6-dev 出错 &#xff08;3&#xff09;进入R&…

二极管在晶振震荡电路中作用

在含有两个电容的晶振震荡电路中,二极管需要串联进电路中,在含有电源与接地回路中,对该节点给出一个高电平,输出端输出0-1的高低电平。 两个回路中需要对输出端进行电路分析。配置好电源。晶振需要与两个并联电容串接。 对于晶振,可以使用NE555来实现相同的功能。设计相同…

ADAS多传感器后融合算法解析-上篇

ADAS系统是一种高自动化的软件应用,对系统的鲁棒性与可靠性要求很高,单一传感器往往存在一定限制,此时便需要多传感器融合。多传感器融合会带来如下收益:* 可以在部分场景提升整体感知精度。* 某一传感器出现错误/失效时可以使用另一传感器进行补偿。* 多传感器可以扩…

【评分标准】【网络系统管理】2019年全国职业技能大赛高职组计算机网络应用赛项H卷 无线网络勘测设计

第一部分&#xff1a;无线网络勘测设计评分标准 序号评分项评分细项评分点说明评分方式分值1点位设计图AP编号AP编号符合“AP型号位置编号”完全匹配5AP型号独立办公室、小型会议室选用WALL AP110完全匹配5员工寝室选用智分&#xff0c;其他用放装完全匹配5其它区域选用放装AP…