天天看点

全局唯一id生成算法--雪花算法详解-snowflake

最近公司在搞什么领域负责人,其实就是每个人负责某几个模块,也就是owner的意思,公司的snowflake服务是我负责,借此机会研究下雪花算法

snowflake生成的结果是一个64bit大小的整数,使用long存储,它的结构如下图:

全局唯一id生成算法--雪花算法详解-snowflake

其中

雪花算法可以保证:

生成的所有的id都是随着时间递增

分布式系统内不会产生重复的id(因为有机器位做区分)

运行结果:

因为序列号是每秒最多可以生成4096个id,所以在序列号到达最大值的时候,程序会阻塞直到下一个毫秒时间戳,然后继续生成id,从运行结果来看,在34ms内生成了100000个不同的id,还是比较可观的。

snowflake不依赖数据库也不依赖内存,随时可以生成id,这也是为什么它如此受欢迎,但是因为它在设计时通过时间戳来避免对内存和数据库的依赖,所以它依赖于服务器的时间。  试想,如果服务器的时间发生了错乱或者回拨,这就直接影响了生成的id,有很大可能生成重复的id,且一定会打破递增属性,这也是他的一个致命缺点(不支持服务器时间回拨)

每毫秒生成id的上限受到限制,由于时间戳位是41位的毫秒级时间戳,所以从当前起始到41bit 耗尽,只能坚持70年

程序获取操作系统时间会耗费较多时间

那么如何解决这些问题呢(后面在研究):

百度开源了UIDGenerator 算法

美团团队根据业务场景提出了基于号段思想的 Leaf-Segment 方案和基于 Snowflake 的 Leaf-Snowflake 方案

继续阅读