UUID
优点:能够保证唯一性
缺点:(1)完全的时间数据=>性能比较差、比较长、占用空间大、间接导致数据库性能下降;(2)无序=>导致B+树索引在写的时候会有过多的随机写操作,不会产生有顺序的append操作,而是需要进行insert操作,这将读取整个B+树节点到内存并在插入该条记录后会将整个节点写会磁盘=>在记录占用空间比较大的情况下,写的性能会明显下降
数据库
单库时(自增字段):局限性在于自增字段完全依赖数据库,会导致数据库移植、扩容、洗数据、分库分表问题
分库分表时(水平伸缩=>自增字段+数据库seq+步长step):缺陷在于服务节点固定(即step固定,继续增加服务节点难以进行扩展)、仍强依赖于数据库(对数据库造成压力)
开源项目-Snowflake
Twitter开源的发号器,缺点在于文档简单、发布模式单一、缺少支持和维护
=>自研:一款通用、高性能发号器产品,具有“全局唯一、粗略有序、可反解、可制造”特性,三种发布模式“嵌入发布模式(jar包)、中心服务器发布模式(服务化场景)、REST发布模式(rest api接口)”
二、基本需求
全局唯一:一般悲观策略是使用锁或分布式锁(性能大大降低),而这里将利用时间的有序性,在时间的某个单元下采用自增序列达到全局唯一
粗略有序:完全有序则涉及到数据的汇聚,需要用到锁或分布式锁,考虑到效率问题采用折中方案即粗略有序,将支持秒级有序和毫秒级有序两种方式
可反解:ID具有时间属性且可反解其他信息量,节省空间
可制造:即支持手工处理,可复制、可恢复、可制造
高性能:ID生成取决于网络I/O和CPU的性能,网络I/O一般不是瓶颈,根据经验单台机器TPS能达到10000/s
高可用:对等集群、重试机制、本地容错方案(即本地依赖)
可伸缩:水平伸缩,支持业务量增长
三、核心设计
发布模式
嵌入发布模式:仅限java客户端,通过嵌入jar包式的原生服务,需提前配置本地机器ID
中心服务器发布模式:仅限java客户端,提供一个服务的客户端jar包,java程序像调用本地api一样调用,但依赖于中心的ID产生服务器
REST发布模式:中心服务器通过Restful API导出服务,非java客户端可使用
ID类型
最大峰值型:秒级有序,秒级时间占用30位,序列号占用20位
字段 | 版本 | 类型 | 生成方式 | 秒级时间 | 序列号 | 机器ID |
位数 | 63 | 62 | 60-61 | 30-59 | 10-29 | 0-9 |
最小粒度型:秒级有序,秒级时间占用40位,序列号占用10位
字段 | 版本 | 类型 | 生成方式 | 秒级时间 | 序列号 | 机器ID |
位数 | 63 | 62 | 60-61 | 20-59 | 10-19 | 0-9 |
数据结构
版本:1位,用做扩展位或扩容时的临时方案,默认值0,1则表示扩展或扩容中
ID类型:1位,0-最大峰值型,1-最小粒度型
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-htJbtgYZ-1712689934915)]