9种分布式ID生成方案,让你一次学个够Java进阶课

面试官应该是对应聘者的回答不太满意,他想听到一个他认为最优的解决方案,其实这无可厚非。同样一个bug,能用一行代码解决问题的人和用十行代码解决问题的人,你会选哪个入职?显而易见的事情!所以看待问题还是要从多个角度出发,每种方法都有各自的利弊。

在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?

拿MySQL数据库举个栗子:

在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。

但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。

今天主要分析一下以下9种,分布式ID生成器方式以及优缺点:

那么它们都是如何实现?以及各自有什么优缺点?我们往下看

在Java的世界里,想要得到一个具有唯一性的ID,首先被想到可能就是UUID,毕竟它有着全球唯一的特性。那么UUID可以做分布式ID吗?答案是可以的,但是并不推荐!

优点:

缺点:

基于数据库的auto_increment自增ID完全可以充当分布式ID,具体实现:需要一个单独的MySQL实例用来生成ID,建表结构如下:

CREATEDATABASE`SEQ_ID`;CREATETABLESEQID.SEQUENCE_ID(idbigint(20)unsignedNOTNULLauto_increment,valuechar(10)NOTNULLdefault'',PRIMARYKEY(id),)ENGINE=MyISAM;insertintoSEQUENCE_ID(value)VALUES('values');当我们需要一个ID的时候,向表中插入一条记录返回主键ID,但这种方式有一个比较致命的缺点,访问量激增时MySQL本身就是系统的瓶颈,用它来实现分布式服务风险比较大,不推荐!

前边说了单点数据库方式不可取,那对上边的方式做一些高可用优化,换成主从模式集群。害怕一个主节点挂掉没法用,那就做双主模式集群,也就是两个Mysql实例都能单独的生产自增ID。

那这样还会有个问题,两个MySQL实例的自增ID都从1开始,会生成重复的ID怎么办?

解决方案:设置起始值和自增步长

MySQL_1配置:

set@@auto_increment_offset=1;--起始值set@@auto_increment_increment=2;--步长MySQL_2配置:

set@@auto_increment_offset=2;--起始值set@@auto_increment_increment=2;--步长这样两个MySQL实例的自增ID分别就是:

那如果集群后的性能还是扛不住高并发咋办?就要进行MySQL扩容增加节点,这是一个比较麻烦的事。

从上图可以看出,水平扩展的数据库集群,有利于解决数据库单点压力的问题,同时为了ID生成特性,将自增步长按照机器数量来设置。

增加第三台MySQL实例需要人工修改一、二两台MySQL实例的起始值和步长,把第三台机器的ID起始生成位置设定在比现有最大自增ID的位置远一些,但必须在一、二两台MySQL实例ID还没有增长到第三台MySQL实例的起始ID值的时候,否则自增ID就要出现重复了,必要时可能还需要停机修改。

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

CREATETABLEid_generator(idint(10)NOTNULL,max_idbigint(20)NOTNULLCOMMENT'当前最大id',stepint(20)NOTNULLCOMMENT'号段的布长',biz_typeint(20)NOTNULLCOMMENT'业务类型',versionint(20)NOTNULLCOMMENT'版本号',PRIMARYKEY(`id`))biz_type:代表不同业务类型

max_id:当前最大的可用id

step:代表号段的长度

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

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

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

Redis也同样可以实现,原理就是利用redis的incr命令实现ID的原子性自增。

127.0.0.1:6379>setseq_id1//初始化自增ID为1OK127.0.0.1:6379>incrseq_id//增加1,并返回递增后的数值(integer)2用redis实现需要注意一点,要考虑到redis持久化的问题。redis有两种持久化方式RDB和AOF

雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器。

Snowflake生成的是Long类型的ID,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特。

根据这个算法的逻辑,只需要将这个算法用Java语言实现出来,封装为一个工具方法,那么各个业务应用可以直接使用该工具方法来获取分布式ID,只需保证每个业务应用有自己的工作机器id即可,而不需要单独去搭建一个获取分布式ID的应用。

Java版本的Snowflake算法实现:

uid-generator需要与数据库配合使用,需要新增一个WORKER_NODE表。当应用启动时会向数据库表中去插入一条数据,插入成功后返回的自增ID就是该机器的workId数据由host,port组成。

对于uid-generatorID组成结构:

Leaf同时支持号段模式和snowflake算法模式,可以切换使用。

leaf.name=com.sankuai.leaf.opensource.testleaf.segment.enable=trueleaf.jdbc.url=jdbc:mysql://localhost:3306/leaf_testuseUnicode=true&characterEncoding=utf8&characterSetResults=utf8leaf.jdbc.username=rootleaf.jdbc.password=rootleaf.snowflake.enable=false#leaf.snowflake.zk.address=#leaf.snowflake.port=启动leaf-server模块的LeafServerApplication项目就跑起来了

Leaf的snowflake模式依赖于ZooKeeper,不同于原始snowflake算法也主要是在workId的生成上,Leaf中workId是基于ZooKeeper的顺序Id来生成的,每个应用在使用Leaf-snowflake时,启动时都会都在Zookeeper中生成一个顺序Id,相当于一台机器对应一个顺序节点,也就是一个workId。

(1)导入Tinyid源码:

(2)创建数据表:

datasource.tinyid.names=primarydatasource.tinyid.primary.driver-class-name=com.mysql.jdbc.Driverdatasource.tinyid.primary.url=jdbc:mysql://ip:port/databaseNameautoReconnect=true&useUnicode=true&characterEncoding=UTF-8datasource.tinyid.primary.username=rootdatasource.tinyid.primary.password=123456(4)启动tinyid-server后测试

引入依赖

com.xiaoju.uemc.tinyidtinyid-client${tinyid.version}配置文件

tinyid.server=localhost:9999tinyid.token=0f673adf80504e2eaa552f5d791b644ctest、tinyid.token是在数据库表中预先插入的数据,test是具体业务类型,tinyid.token表示可访问的业务类型

//获取单个分布式自增IDLongid=TinyId.nextId("test");//按需批量分布式自增IDListids=TinyId.nextId("test",10);总结本文只是简单介绍一下每种分布式ID生成器,旨在给大家一个详细学习的方向,每种生成方式都有它自己的优缺点,具体如何使用还要看具体的业务需求。

THE END
1.算法笔记(三)算法学习技巧1.如何总结各个算法? 首先找出各个算法自己的主要特性,拿出来之后去和其它算法比较,时间复杂度和空间复杂度相互比较,这是建立知识之间联系的一个过程,其次,也要拿出他们的共同点、共同之处,使他们联系更紧密。 2.三遍读书方法? 第一遍快速阅读一遍(在n+1)基础之上,第一遍是为了了解全书内容,让自己有一个把握,https://www.code456.com/article/3598351.html
2.保姆级学习时间线分享零基础如何入门算法竞赛?掌握平面几何和立体几何中的基本算法,如点线距离、线面交、求二维凸包等。 练习 刷洛谷绿题到蓝题,刷题在精而不在多,其实很多时候我们不是不会做某道题,而是想不到该这么做(例如你看了题解发现都是自己会的,但是却想不到得这么用),所以我们应该做一道题就分析这道题是怎么出的,它有哪些套路,而不是单纯https://zhuanlan.zhihu.com/p/646850472
3.怎样高效学习数学?学生在训练中应注重提升心算和笔算的速度与精确度,同时,教师应引导学生理解计算过程中的算理,强化对算法本质的认识。此外,通过例题的多样化练习,可以让学生在实践中不断巩固计算技巧,提高解题能力,为未来的数学学习打下坚实的基础。做得对。在数学计算中,正确性是首要的,只有确保计算结果的正确,才能进一步讨论https://baijiahao.baidu.com/s?id=1818458407474987245&wfr=spider&for=pc
4.对话MiniMax闫俊杰:AGI不是大杀器,是普通人每天用的产品《晚点》:今年 1 月你们是国内第一个推出 MoE 大模型的,其它公司去年主要在迭代 dense(稠密)模型,因为进展更快、更确定。做 MoE 是一场豪赌吗? 闫俊杰:一开始我也认为我们在赌,那几个月别人都在快速进步,走在更稳的路上,而我们在赌一个更难的东西。 https://maimai.cn/article/detail?fid=1830969028&efid=lbz_ey4CvlWopp-qSVrHXQ
5.Contents/premium.mdatmaster·Newslab2020/Contents·GitHub通讯165:Facebook“数据门”究竟是怎么回事? 通讯53:一门叫做“抵制狗屁”的大学课程 654 俄乌战争一周年,俄国媒体怎样了? 2023/2/23 战争状态下的全面审查; 离开的和留下的; “离岸记者”群体。 653 俄亥俄脱轨事故中的媒体表现 2023/2/19 关于事故的已知事实; https://github.com/Newslab2020/Contents/blob/master/premium.md
6.四年级数学除法教案(4)练一练。 180÷30 240÷40 420÷60 设计意图:教学整十数除几百几十数时,主要是让学生运用已学知识进行迁移,自主学习新知。 3.探究估算方法。 (1)师:同学们这么快就把分彩旗的问题解决了,但是我们在生活中往往会碰到这样一些情况:大队辅导员多买了3面彩旗,那么83面彩旗,每班分20面,大约可以分给几个https://mip.jy135.com/jiaoan/929142.html
7.婚嫁择日中“大小利月”的正确用法2、阴年出生女命推算法: 比如女方属丑年出生的,那么大利月就是丑后一位(顺退一位)子月大利,与子相冲之午月也为大利月。(余仿此) 二、结婚小利月的推算方法:阳年出生女取年命地支前两位及其对冲之月;阴年出生女取年命地支后两位及其对冲之月。以下举例说明用法: http://www.360doc.com/content/21/1104/11/34973859_1002703935.shtml
8.精选小学数学教案范文(通用14篇)1、让学生在理解算理的基础上,掌握三位数除以一位数,商中间有0、末尾有0的除法笔算方法。知道0除以任何不是0的数都等于0。 2、在教学中引导学生独立探索计算方法,再交流比较不同的算法,得到简便的方法。并能规范书写、正确笔算。 教学重难点: 商中间、末尾有0的除法笔算过程方法,0的书写。 https://www.fwsir.com/jiaoan/html/jiaoan_20220221102931_1654433.html
9.2013年度山东势学技术奖建议授奖人选和项目公示现将2013年度山东省科学技术最高奖评审委员会,山东省自然科学奖、技术发明奖和科学技术进步奖评审委员会,山东省国际科学技术合作奖评审委员会评审通过的建议授奖人选和项目向社会公示。 山东省科学技术最高奖人选,山东省自然科学奖、技术发明奖和科学技术进步奖一、二等奖人选和项目,山东省国际科学技术合作奖人选在《大https://paper.dzwww.com/dzrb/content/20131118/Articel07002MT.htm
10.悄悄学习Doris,偷偷惊艳所有人ApacheDoris四万字小总结2010Doris3 ,让查询再快一点 随着业务数据量的不断增长,Doris2 系统的问题也逐渐成为业务发展的瓶颈。首先体现在 Doris2 无法满足业务的查询性能需求,主要是对于长时间跨度的查询请求、以及大客户的查询请求。其次,Doris2 在日常运维方面基本上都需要停服后手动操作,比如 Schema Change、集群扩缩容等,一方面用户体验https://xie.infoq.cn/article/b2250c2d887f69d8519a3f50b
11.JAVA算法和数据结构等等进步来自一点一滴的积累资源7. **持续学习与积累**:博客作者强调“进步来自一点一滴的积累”,这表明博客的内容不仅仅是理论知识的介绍,还可能包含作者在实际开发中遇到的问题及解决方案,分享学习过程中的心得和经验。 通过这个项目,开发者可以学习到如何搭建自己的技术博客,同时获取到丰富的 Android 相关知识、设计模式实践以及基础算法的理解,https://download.csdn.net/download/weixin_42099858/16046051
12.统计学权威盘点过去50年最重要的统计学思想,因果推理bootstrap等2.2. 计算上的进步 元算法(利用现有模型和推理步骤的工作流)在统计学中被广泛使用,比如最小二乘法,矩估计(the method of moments),最大似然,等等。 在过去 50 年里所开发的许多机器学习元算法都有一个特征,就是它们会以某种方式拆分数据或模型。学习元算法(Learning Meta-Algorithms)与分治计算方法相关,最著名https://www.thepaper.cn/newsDetail_forward_12835098
13.帖子详情一个照片要选两遍(对于微信,甚至你选进去以后它是不会提示的,需要进去,选好,退出来,再进,才行)。对于后者,那么请问,谁在用呢?有app会操这个心? 对于Picker我想多说一点。太好用了,应用流畅,加载快,不少应用本来图片选择器流畅度低一些,但在NEXT上直接调用picker就极快,还能直接接入系统搜索,很方便,接入系统https://cn.club.vmall.com/mhw/consumer/cn/community/mhwnews/article/id_1000000000001941148/
14.每日热点0424例如,针对青少年进行心理测试时比较关注的隐私保护问题,该科研团队采用区块链算法加密技术,每一个用户单独拥有一个密钥,有效增强了软件应用的安全性。 值得一提的是,相较于传统的评估系统,该科研团队研发的新系统不仅采用了带情境的测试题及多媒体编排技术,有效引导青少年完成测试,而且还采用了心理测试量表的动态组合与https://www.sccdc.cn/Article/View?id=27549
15.中考数学复习方法知识点的归纳总结对我们理清我们所学知识的脉络有很好的帮助。对学过的章节内容做一个框架图或整理一个知识大纲,理清各个知识点之间的联系。对其中的重点,难点、易混淆的知识点应当分门别类。 第三、建立自己的错题本和精题本 同学们可以建立自己的错题本和经典题型本。对于平时的作业,小测试中出现的错题,有选择https://www.oh100.com/zhongkao/5524729.html
16.小学五年级上册数学复习计划(通用15篇)时间过得真快,总在不经意间流逝,我们的工作又进入新的阶段,为了在工作中有更好的成长,立即行动起来写一份计划吧。好的计划都具备一些什么特点呢?以下是小编帮大家整理的小学五年级上册数学复习计划,希望对大家有所帮助。 小学五年级上册数学复习计划 篇1 一、指https://www.ruiwen.com/jihua/5680595.html
17.学习《数学课程标准》心得体会(精选32篇)事实上,熟悉这一教学内容的教师都清楚,只需用一种方法(即用前项除以后项)便可分别求比值和化简比,细心的学生通过练习也能体察到这一点,但道理何在?通过思考,我们可以发现这一教学内容具有以下几点价值:⑴它沟通了分数、除法、比知识间的广泛联系,学生在探究过程中能把新旧知识融汇贯通;⑵在探究过程中能体验研究https://www.yjbys.com/xuexi/xinde/2800504.html
18.面经分享中科院老哥的算法&开发岗面经总结三者具备一者,其实就可以保证你能找到一份算法岗的工作 三者具备两者,其实就具备了收割普遍大厂的offer的能力 三者全具备,那就完全具备了收割大厂核心部门ssp的能力(秋梨膏,带带我好吗) 当然以上三点的前提是,你的编程能力必须过关。 (1)比赛 比赛这方面,最快的捷径就是有人带,如果实在没人带,只能考自己多看多https://cloud.tencent.com/developer/article/1537579
19.AlphaGo联合创始人:人工智能将解决更多现实问题哈萨比斯:不是的。我们之前也可以这样做。这样做不会让程序更强大,这只是为了尝试纯粹的自学,摆脱人为控制的部分。我们认为,这一算法可以在不受控的情况下运转。我们去年让人工智能去玩Atari的游戏,人工智能从像素点的研究起步,这其中没有掺杂任何人类知识。人工智能从屏幕上的随机像素开始。 https://sports.sina.cn/others/qipai/2016-03-12/detail-ifxqhmve9114620.d.html
20.Qt机器学习算法qt应该怎么学mob6454cc6441b6的技术博客Qt机器学习算法 qt应该怎么学,一、学习规划与必要知识点总结1、QT的下载与安装;1)下载:进入官网,下载QT在线下载工具(QT5.15后都必须在线下载):2、学习QT三大件:QTCreator、QTDesigner、QTAssistant3、QT的三种开发方式以及qmake与cmake方式区别:1)使用QTGUI框架,https://blog.51cto.com/u_16099185/9631420