暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分布式系统中高并发场景的唯一ID生成策略

鲸鱼手记 2021-09-03
518

点击上方蓝色“鲸鱼手记”,关注并选择“设为星标”

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写出来与大家一起交流,也希望采用这种方式记录自己的学习之旅。


目录

1.有哪些?1.1.SnowFlake算法是什么?1.2.Redis递增ID思路:实例:key的命名规范:优缺点:高可用:1.3.UUID由以下几部分组成优缺点:1.4.Mysql整型自增优缺点:2.各方案对比3.如何选择?4.最后:国内大厂处理策略

1.有哪些?

  1. SnowFlake算法,雪花算法;

  2. Redis自增ID,incr(key);净键为key储存的数字值增1;

  3. 数据库自增ID;

  4. UUID.

1.1.SnowFlake算法是什么?

snowflake算法是Twitter开源的分页式ID生成算法,结果是一个Long长整型的ID.

Twitter 的雪花算法 产生的是一个 64位的长整型 第一位未使用,固定为0 接下来41位为毫秒级时间,41位的长度可以使用69年 然后是10位节点id,最多支持部署1024个节点,(一般是数据中心编号和机器编号组成) 最后12位是毫秒内单位的算法调用计数,(意味着每个节点每毫秒产生4096个id序号)

上面4部分加起来是64比特位 = 8 字节 =Long(转换成字符串后长度最多为19

1.2.Redis递增ID

Java中的基本类型所占的字节

Oracle产生序列号的方式

思路:

复用增长计数Api,业务系统在自增长的基础上,配合其它信息组成一个唯一ID.

Redis的incr(key),api用于将key的值进行递增,并返回增长数值.

如果key不存在,则创建并赋值为0.

利用Redis的特性:单线程原子操作,自增计数Api,数据有效机制.

实例:

业务编码+时间+自增数值

业务编码+工号+时间+自增数值

业务编码+地区+时间+自增数值

key的命名规范:

系统名+模块+功能+key 例如:dlspalletbind_id

优缺点:

优点: 拓展性强,可以方便的结合业务进行处理 利用redis操作原子性的特征,可以保证在并发的时候不会重复

缺点: 引入redis就意味着引入其他三方依赖 增加一侧网络开销 需要对reids服务实现高可用

高可用:

自动分片

哨兵模式

ps:集群并不能做高可用,因为redis集群中没有选举机制,所以需要采用哨兵(选举的机制)的机制配置高可用

1.3.UUID

Uuid是按照开放软件基金会(osf)制定的标准计算 用到了以太网开地址(MAC),纳米级时间,芯片id码和许多可能的数字

由以下几部分组成

当前日期和时间 时钟序列 全局唯一的ieee机器识别号(如果有网卡,从网卡获取,没有网卡以其他方式获取) 生成长度为36的字符串

优缺点:

优点: 使用简单 不依赖其他组件 不影响数据库拓展

缺点: 数据库索引效率低 太过于无意义.用户不友好 长度36的字符串,空间占用大 应用集群环境,机器多的时候,重复几率大

1.4.Mysql整型自增

Mysql 整型自增索引之所以快是因为mysql 采用b+树对整型进行了加速 Mysql使用autoincrement, oracle使用sequence序列 集群环境下,不同的库,设置不同的初始值,每次自增加 100 Mysql下修改起点和步长的方式 设置起点 Set @@autoincrementoffset=1 设置起点为1 设置步长 Set@@autoincrementincrement=100 // 设置步长为100 查看参数 show VARIABLES like 'auto%' // 查看参数

优缺点:

优点: 无需编码 性能也过得去 索引友好

缺点: 大表不能做水平分表,否则插入删除易出现问题(已经存在很大数据的时候再分表,容易出现问题) 依赖前期规划,拓展麻烦 依赖mysql内部维护自增锁,高并发下插入数据影响性能 在业务操作父,子(关联表)插入时,要先父表 后子表

相对于UUID其实数据库自增表的效率稍低 特点是:互斥 排他 可重入

2.各方案对比


优点缺点字节
UUID简单,不占用宽带无序,查询慢,不可读32字节
DB自增代码简单,递增DB单点故障,扩展性瓶颈自增
SnowFlake算法性能优,不占用宽带,趋势递增依赖服务器时间18
Redis自增ID无单点故障,性能优于DB,递增,拓展灵活占用宽带,Redis集群维护自定义

3.如何选择?

SnowFlake算法性能最高,其次Redis的incr高.

4.最后:国内大厂处理策略

国内有很多厂家基于snowflake算法进行了国产化,例如:

百度的uid-generator:

https://github.com/baidu/uid-generator

https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md

美团Leaf:

https://github.com/Meituan-Dianping/Leaf

https://github.com/Meituan-Dianping/Leaf/blob/master/README.md

基本是snowflake的进一步优化,解决时钟回拨问题.


文章转载自鲸鱼手记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论