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

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,数据有效机所ex.

实例:

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

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

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

key的命名规范:

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

优缺点:

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

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

高可用:

自动分片

哨兵模式

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

1.3.UUID

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

由以下几部分组成

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

优缺点:

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

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

1.4.Mysql整型自增

Mysql 整型自增索引之所以快是因为mysql 采用b+树对整型进行了加速
Mysql使用auto_increment, oracle使用sequence序列
集群环境下,不同的库,设置不同的初始值,每次自增加 100
Mysql下修改起点和步长的方式
设置起点
Set @@auto_increment_offset=1 // 设置起点为1
设置步长
Set@@auto_increment_increment=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的进一步优化,解决时钟回拨问题.

你可能感兴趣的:(分布式服务框架)