分布式ID自增策略(一)

25 阅读3分钟

之前项目有用到过分布式场景下使用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等中间件的

tech.meituan.com/2017/04/21/…

自研分布式ID生成器

设计方案是参考了Leaf,采用本地内存+Mysql配置进行实现

优点:更加的灵活,了解底层原理,便于 后续的维护,

缺点:技术难度高,总之一句话就是麻烦

制作不易,欢迎点赞关注~