在分布式系统中,经常需要对大量的数据、消息、http请求等进行唯一标识,例如链路追踪traceId、身份标识号、订单流水号、操作记录流水号、优惠券id等等。
这个时候数据库自增主键已经不能满足需求,需要一个能够生成分布式ID的系统。
UUID是Universally Unique Identifier的缩写,包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12包含36个字符的字符串,例如:321dsa13-das2-d231-gfdd-213as8asd899
UUID经由一定的算法机器生成,为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。
优点:
缺点:
利用数据库自增ID的特性来生成,如MySQL的auto_increment。其优点是数字类型,并且可以自增。当然缺点就是并发场景下的性能瓶颈。
进一步优化:放弃主从复制的高可用架构,采用多主架构。每个主库设置不同的起始值和相同的步长,保证了号段的隔离。
Redis中的incr命令,可以实现原子自增。相比较数据库而言,Redis可支撑的并发量非常高,性能好。
但需要考虑下面两种情况造成的数据不一致问题:
使用ZooKeeper作为分段节点协调工具,每台服务器首先从Zookeeper 获取一段号码,如[1,1000]的ID,此时Zookeeper上保存最大值 1000,每次获取的时候都会进行判断,如果ID <=1000,则更新本地的当前值,如果为1001,则会将Zookeeper 上的最大值更新至2000,本地缓存段更新为1001-2000,更新的时候使用分布式锁来实现。(相当于用Zookeeper实现了基于数据库的号段模式)
效率高。
维护成本较高,不能同时满足多个系统对ID的需求,不够灵活。
号段模式的思想是客户端每次从数据库中取出一批ID供程序使用,从表中获取本次ID值的范围,如[1,1000],然后客户端将申请的号段[1,1000]加载到内存。表结构参考如下:
等这批号段ID用完,再次向数据库申请新号段,对max_id字段做一次update操作(update id_generator set max_id = #{max_id+step}, version = version + 1 where version = # {version} and biz_type = XXX),update成功则说明新号段获取成功,新的号段范围是(max_id ,max_id +step]
进一步优化:
在号段消耗一半的时候,提前预留下一段号段。将预留号段时机提前,减少阻塞发生概率。一般称此为双Buffer机制。不同业务可以设置不同的生成规则。
雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器。
雪花算法,不依赖其它系统或数据库,以服务的方式部署,供其它服务调用,稳定性高,生成 ID 的性能也非常高。
给每台机器分配一个唯一标识,然后通过下面的结构实现全局唯一ID:
由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。
Tinyid是滴滴开源的分布式ID生成方案,开源地址见于参考文档1,只提供基于号段模式来生成ID(加入了双Buffer机制)。
UidGenerator是由百度技术部开发,开源地址见于参考文档2,基于Snowflake实现的优化算法。借用未来时间和双Buffer来解决时间回拨与生成性能等问题,同时结合MySQL进行ID分配。
Leaf是美团开源的分布式ID生成方案,开源地址见于参考文档3。提供两种生成的ID的方式:雪花算法模式和号段模式。可通过配置文件来指定。
Leaf的雪花算法模式依赖于ZooKeeper,其workId的生成策略是基于ZooKeeper的顺序ID来生成的;号段模式也是基于数据库的号段模式+双Buffer机制实现的。
本文由知识库于2021-09-14发表在龙哥云资源网,如有疑问,请联系我们。本文链接:https://www.longgeyun.com/knowledge/3584.html
上一篇网站源码交易平台源码(网站买卖交易平台)
下一篇网上报名的用户名怎么注册(手把手教你注册)
高校最常见的食物中毒有哪些
急性肠胃炎与食物中毒怎么分辨
莫代尔面料和纯棉面料哪个好内裤 哪个儿童可以穿
为什么说开速腾的都不是一般人 速腾开出去有面子吗
活珠子和毛蛋的区别在哪里 哪个好吃
家里放石头的八大禁忌有哪些 家中石头最佳摆放位置
怎么判断自己帅还是丑男 男生怎样越长越帅
单身女生红绳戴左手还是右手 女生红绳戴哪里合适
Pr2020零基础快速入门
文字转语音App最新版3.0
APP下载页源码-带后台