关于分布式uuid的一点设想
在一次公开课上,听别人讲过全局分布式uuid的设计,听过twitter的snowflake的设计。也听过,如果使用单独的计数器服务,不可能每次都保存当前计数器到文本,自己想到应该可以每隔一些数,例如1万次,10万次,反正64位的空间比较大,然后保存起来,那么就没有每次保存,对硬盘的写入压力。当出现故障的时候,跳过这么多数就可以了。只是,这个据说也是微信的uuid设计方案。我如果拿这个来讲,岂不是抄袭很严重。下面先给出uuid服务的图:

对于snowflake和微信的计数保存方案,各个各的优点,在我看来,可以考虑联合这两种方案。方案大致如下:
1. 对于不同的uuid server,给予不同的前缀,那么不同的uuid服务器的计数互不干扰,这个依赖于运维来实现,当然,如果开发打算自己做,我觉得也没有问题。
2. 对于每个uuid服务器,启动的时候,从当前电脑获取出当前的时间,在这里,可以考虑从epoch开始的秒数,然后有一个次数计数器,从0开始计数,假设这个计数器为32位,每次来一个请求,次数计数器+1,可以考虑当这个计数器达到最大值时,检查一下当前秒数,是不是和上一次获取秒数不同,如果相同(对于当前例子来说,基本不可能),则休眠若干毫秒,然后再次获取当前时间,如果不同,则将次数计数器重新置为0,继续进行计数。你们应该不难看出,我这里的计数器是
uuid server 的前缀 + 当前秒数 + 次数计数器值
3. 对于程序崩溃的处理,并不困难,只需要在程序启动的地方添加一个sleep(休眠),让程序1s后启动就可以了,那么就可以保证新的计数器,之前不会出现过。
4. 参数说明:上面所说的参数,可能不是最优的,例如,可以考虑,将时间改为从epoch开始的毫秒数,0.1s,或者其他的,这个看各自的需求,计数器,也可以考虑使用30个bit,24个bit,那么对应的最大值也需要根据这个进行调整,可能使总的计数器位数更少,或者更多。总之,这些东西有赖于各自测试,达到自己的目的就好。调整时间的精度,例如精度调整为0.1s,那么程序再次启动,sleep的时间可以更短,这个对某些项目可能有所帮助。
5. 需要处理的问题,这里主要是时间。有一点需要说明,这种实现方式,不同电脑存储的uuid之间没有严格的时间关系,没办法比较先后,同一台电脑的uuid可以区分先后。对于同一台电脑,重启之后运行正常,依赖于本地时间没有被改动,如果本地时间向前调整,那么可能会出现uuid重复的问题,先后顺序也不能被保证。只是,如果次数计数器值空间很大,那么出现重复的几率应该不大。如果打算将当前的前缀给另外一台电脑使用,那么需要那台电脑的时间不低于当前电脑,否则也可能出现重复。只是,如果那台电脑的时间在这台电脑时间之后,应该没有问题。
6. 如果担心时间问题,可以在程序中改变时间的时候,进行一次打印,打印出当前的时间,再次启动的时候可以进行查看。
7. 顺序的额外说明:不同电脑的时间同步对uuid跨电脑排序用处不大,因为uuid中的时间,只能说明记录的uuid发生在这个时间或者之后,并不一定是这个时间。
8. 对于计数器的实现来说,可以考虑使用atomic,也可以考虑使用中间件一类的,看实现方便,以及各自喜好。
9. 如果次数计数器为64位,或者类似的长度,可以考虑不进行检查,只在每次重启的时候,sleep例如1s,然后从0开始计数,因为按照当前甚至未来一段时间,64位的数字也很难在比较短的时间内耗尽,这样可以使处理逻辑更加简单,不过,可能会增加总的计数器的位数.
关于这个问题,就简单说到这里,如果文中有什么问题,希望能够指出来。
关于分布式uuid的一点设想的更多相关文章
- 分布式UUID的生成
背景 最近有个项目:涉及到分布式计算,tps相对较高,流程之间是异步调用,流程间相互依赖的对象(涉及记录外键)需要持久化.这就衍生出了需要在JVM中快速生成分布式UUID的问题 方案 1.通过JDK标 ...
- Redis分布式锁的一点小理解
1.在分布式系统中,我们使用锁机制只能保证同一个JVM中一次只有一个线程访问,但是在分布式的系统中锁就不起作用了,这时候就要用到分布式锁(有多种,这里指 redis) 2.在 redis当中可以使用命 ...
- 如何在高并发的分布式系统中产生UUID
一.数据库发号器 每一次都请求数据库,通过数据库的自增ID来获取全局唯一ID 对于小系统来说,这是一个简单有效的方案,不过也就不符合讨论情形中的高并发的场景. 首先,数据库自增ID需要锁表 而且,UU ...
- Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!(转)
基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本篇文章主要是基于我们实际项目中因为redis分布式锁造成的事故分析及解决方案.我们项目中的抢购订单采用的是分布式锁来解决的,有一次,运营做了一 ...
- 【转】分布式理论-CAP理论
一 CAP理论简述 CAP (Consistency, Availability, Partition Tolerance,) 理论是NoSQL数据库管理系统构建的基础. 强一致性:等同于所 ...
- 从UUID想到的
1.UUID的定义 通用唯一标识符(UUID)被设计成一个在时间和空间上都独一无二的数字,常被用作唯一性标识. UUID是一个由5位十六进制数的字符串表示的128比特数字,其格式为 aaaaaaaa- ...
- Java分布式锁,搞懂分布式锁实现看这篇文章就对了
随着微处理机技术的发展,人们只需花几百美元就能买到一个CPU芯片,这个芯片每秒钟执行的指令比80年代最大的大型机的处理机每秒钟所执行的指令还多.如果你愿意付出两倍的价钱,将得到同样的CPU,但它却以更 ...
- 分布式-技术专区-Redis分布式锁实现-第一步
承接前面一篇Redis分布式锁的原理介绍 https://www.cnblogs.com/liboware/p/11921759.html 我们针对于实现方案进行接下来上篇进行重新的规划和定义以及完善 ...
- 分布式系统之CAP理论
任老师第一节主要讲了分布式系统实现时候面临的八个问题,布置的作业就是这个,查询CAP理论. 笔者初次接触分布式,所以本文主要是一个汇总. 一.CAP起源 CAP原本是一个猜想,2000年PODC大会的 ...
随机推荐
- hdu多校第4场 B Harvest of Apples(莫队)
Problem B. Harvest of Apples Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Su ...
- python--jianja2
一:渲染模版 要渲染一个模板,通过render_template方法即可. @app.route('/about/')def about():return render_template('about ...
- codeblock不能调试
问题:codeblock 不能调试,如下图: 解决方法: 首先,项目的保存路径不能是中文路径. 其次,必须创建工程. 最后,build选项里select target选成debug codebloc ...
- 用matlab生成mif文件
在FPGA中,rom模块的初始化文件分为两种,一种是hex文件,另外一种是mif文件,这两种文件都可以通过Quartus进行手工创建,进行手工输入数据,也可以借助于专用的文件编辑器完成编辑. 在此介绍 ...
- 第一周例行报告psp
此作业要求参见 https://edu.cnblogs.com/campus/nenu/2018fall/homework/2100 (1)psp表
- Hadoop学习笔记02_MapReduce练习
搭建好环境之后 ,就来跑个简单的Mapreduce试试看吧.这个比第一课难多了,需要多多练习并熟练掌握. 需要编写py脚本以及shell脚本, 所以需要学习Python和Linux的Shell编程. ...
- JPA问题汇总
JPATools生成的实体类对大小写敏感.如果一个数据库中大小写混乱,生成的实体类也会大小写都有.这种情况会导致HibernateSQL语句查询,每次都会查询第一个大小写字段,所以需要加映射关系.@C ...
- Locust 参数化
概述: 和Loadrunner一样对于多用户并发时,重复登入或者数据的重复使用会造成脚本的失败,那么我们引入Loadrunner的参数化概念,对用户数据进行参数化来使脚本运行成功. 头绪: use ...
- maven pom.xml配置文件详解
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/ ...
- Angular4.0引入第三方框架,eg: bootstrap、jquery
最近学习angular4.0,在练习是需要使用jquery和bootstrap.但是查阅了,大多数都是angular2的方法,或者是angular4.0的方法但是不准确.花了一些时间终于捣腾出来了,把 ...