之前项目有用到过分布式场景下使用id发号器的场景,最近事情基本忙完了,没有太多事情,今天将这块的内容分享大家。 场景分析:
用户注册场景中,当注册完成以后,需要分配一个UserId,针对这个id,要求:
-
唯一,保证分发的id是唯一,不会出现碰撞的情况
-
无规律,随机性,非连续递增 防止别人爬数据或者分析我们的系统情况等
应用场景:
在分库分表中,需要新增数据,需要具备完整的Id值,比如用户id生成、订单id生成、消息id生成
分布式id发号器出现之前,其实还有很多现成的解决方式,比如UUID,数据库自增,reids自增,第三方发号器
UUID机制
算法核心是结合机器的网卡、本地时间、随机数来生成UUID
优点:本地生成,生成简单、性能好、没有高可用问题
缺点:长度过长、无序,并且是字符串,对于mysql的查询不方便(字符串类型需要解析为一个个字符,再通过转换一个ass码再做一个比对),且容易造成叶子节点裂变
数据库自增
使用数据库的id的自增策略,如mysql的auto_incrment,并且可以使用两台数据库来设置不同的步长来生成不重复的id
优点:数据库的生成id是绝对有序的,高可用实现简单
缺点:部署成本高,存在性能瓶颈
Redis自增
redis的所有命令的执行都是单线程的,并且提供incr和increby这样的自增命令,所以能够保证生成的id是原子性的
优点:不用依赖数据库来存储,性能也相较于数据更高,数字id天然排序,对分页或者需要排序的地方很有帮助
缺点:存在redis当中,如果内存淘汰策略选择不当,会导致数据的丢失,并且不支持非连续的id生成
雪花算法
利用 Zookeeper作为服务发现 来实现一个全局id生成
优点:性能高,低延迟,按照时间有序,一般不会存在ID碰撞问题
缺点:需要独立的开发和部署,依赖机器时钟,存在时钟回拨问题
TPS理论值可以达到2^12*1000
雪花算法的详细内容可以参考下面这篇文章:
cloud.tencent.com/developer/a…
国产的生成器美团的Leaf和百度UidGenerator
UidGenerator底层也是基于雪花算法但是社区不怎么活跃都很久没有维护过了,美团的Leaf能够保证全局唯一性,趋势递增,单调递增,但是同时也是需要zookeeper等中间件的
自研分布式ID生成器
设计方案是参考了Leaf,采用本地内存+Mysql配置进行实现
优点:更加的灵活,了解底层原理,便于 后续的维护,
缺点:技术难度高,总之一句话就是麻烦
制作不易,欢迎点赞关注~