您当前的位置: 首页 >  分布式

科技D人生

暂无认证

  • 0浏览

    0关注

    1550博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

高并发分布式系统中生成全局唯一Id汇总

科技D人生 发布时间:2018-05-30 10:39:29 ,浏览量:0

全局唯一ID

  • 《高并发分布式系统中生成全局唯一Id汇总》
  • Twitter 方案(Snowflake 算法):41位时间戳+10位机器标识(比如IP,服务器名称等)+12位序列号(本地计数器)
  • Flicker 方案:MySQL自增ID + "REPLACE INTO XXX:SELECT LAST_INSERT_ID();"
  • UUID:缺点,无序,字符串过长,占用空间,影响检索性能。
  • MongoDB 方案:利用 ObjectId。缺点:不能自增。
  • 《TDDL 在分布式下的SEQUENCE原理》
  • 在数据库中创建 sequence 表,用于记录,当前已被占用的id最大值。
  • 每台客户端主机取一个id区间(比如 1000~2000)缓存在本地,并更新 sequence 表中的id最大值记录。
  • 客户端主机之间取不同的id区间,用完再取,使用乐观锁机制控制并发。

数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。

单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求:

1 不能有单点故障。

2 以时间为序,或者ID里包含时间。这样一是可以少一个索引,二是冷热数据容易分离。

3 可以控制ShardingId。比如某一个用户的文章要放在同一个分片内,这样查询效率高,修改也容易。

4 不要太长,最好64bit。使用long比较好操作,如果是96bit,那就要各种移位相当的不方便,还有可能有些组件不能支持这么大的ID。

一 twitter

twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。

1 41位的时间序列(精确到毫秒,41位的长度可以使用69年)

2 10位的机器标识(10位的长度最多支持部署1024个节点)

3 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) 最高位是符号位,始终为0。

优点:高性能,低延迟;独立的应用;按时间有序。 缺点:需要独立的开发和部署。

原理

高并发分布式系统中生成全局唯一Id汇总

java 实现代码

public class IdWorker {

private final long workerId;

private final static long twepoch = 1288834974657L;

private long sequence = 0L;

private final static long workerIdBits = 4L;

public final static long maxWorkerId = -1L ^ -1L

关注
打赏
1662604032
查看更多评论
立即登录/注册

微信扫码登录

0.3522s