基于 Redis 的全局唯一性ID生成器的一些实现思路
前段时间正值开发ID生成中心,看到很多业界大神分享了自己公司的ID生成器的设计思路。现在分享一下自己的思路,供大家参考、吐槽。
业务需求及业内方案,在许多文章中都有介绍,我在这里就不多介绍了。现在直入主题,谈谈自己的设计思路。
基本介绍
1.MySQL记录注册的应用服务信息及生成的应用唯一标识authID。
2.高可用的Redis记录注册的IDKey(应用中ID的唯一标识,一个应用可以申请多个ID)并负责生成、分发ID区间(利用Redis中incr特性)。这里Redis必须保证高可用,至少为双机热备保证数据不丢失。当然这里的IDKey注册可以记录在MySQL中。
3.ID生成中心使用L1、L2缓存从Redis中获取到的ID区间,并实时同步。
4.下游服务可以直接通过Http/RPC,从ID生成中心获取ID。
5.下游服务也可以通过在项目中引入ID生成客户端依赖包来获取ID。因为目前我们并没有那么高频的需求,所以暂时没有开发。
对外接口
1.注册应用服务。
2.注册应用IDKey服务。
3.获取ID服务。
4.获取ID区间服务。
ID生成机制
1.ID生成中心每次从Redis(使用incr命令)中获取一定范围的递增ID区间(该区间范围相对大一些,eg:10000),并同步缓存至L1、L2(避免大量ID区间丢失)。
2.当该应用的该IDKey的ID区间使用率超过一定阈值(eg:>50%)时,ID生成中心自动从Redis(使用incr命令)中获取下一个递增ID区间,缓存至L1、L2,减少消费耗时。
3.当ID生成中心宕机,再次启动时,会优先同步L2中的ID区间至L1中,如果没有再从Redis中通过incr获取,已达到节约ID的目的。
4.这里L1、L2的ID数据同步是异步进行的。
5.ID生成客户端的基本设计思路也是差不多一样的。只不过这是获取的ID区间相对ID生成中心从Redis获取的ID区间会小很多,这里尽量保证俩者区间段有一个相当大的比例区间。对于获取的ID区间具体大小,可以根据个人的需求取舍。
测试结果
单线程调用5000次,RPC平均耗时1ms,Http平均耗时3.7ms
参考链接
干货 | 分布式架构系统生成全局唯一***的一个思路 丁宜人 携程技术中心