分布式ID生成算法——雪花算法

一、雪花算法
世界上不存在两片一样的雪花。

雪花算法(Snowflake),是Twitter公司提出的一种分布式ID生成算法,是分布式ID问题的经典解决方案。此算法生成的是一个64bit(8字节)的ID,在Java中使用8字节的long来存放,在数据库推荐用bigint来存储。

雪花ID结构如下所示,由1bit符号位 + 41bit时间戳 + 10bit工作机器ID + 12bit序列号组成。

符号位:恒为0,保证生成的ID为正整数。
时间戳:用于记录时间戳的毫秒数,通常选用项目上线时间作为时间戳的相对起点。41bit的时间戳可以保证69年的使用,对于普通的项目绝对是够用了。
工作机器ID:10bit的机器ID可以分为两部分,机房ID + 机器ID。这两部分的长度分配没有具体要求,可以根据具体情况动态调整。
序列号:用于区分在同一时间戳内,同一机器生成的ID。12bit一共可以标识4096个ID。
从上面的介绍中,我们不难看出雪花算法可以(优点):

在高并发的情况下保证分布式ID的全局唯一性。
生成的ID按照时间升序排列。


二、面临的问题:时钟回拨问题
时钟回拨,就是服务器上的时间突然倒退回之前的时间,时钟回拨会导致ID不唯一的问题。出现时钟回拨的原因可能是:

人为更改系统时间。
有时候不同的机器上需要同步时间,可能不同的机器存在误差,也会出现时钟回拨。
出现时钟回拨后,我们要怎么解决呢?根据回拨的时间长短的不同,可以采取不同的应对方案。

如果回拨的时间较短,直接在这段时间内拒绝服务,不生成ID。
如果回拨的时间较长,直接阻塞是不可取的。可以提前在机器ID或者序列号中留出拓展位置0,当出现时钟回拨时,将拓展位置1,这样也可以保证生成ID的唯一性。
 

换成个人理解:

共计64位,由4块内容组成:

1、1位容错占位符,默认0,数据若修改为1,主要用于时间回拨;

2、41位的时间保存格式,最大支持69年;

3、10位的分布式机器码;

4、12位的序列号,最大4096个

每台机器每秒产生的数据,基本不会大于4096,所以可以放心使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值