概念和实现
snowflake算法的思路很简单,就是把时间放在前面,机器码放在后面做bit拼接:
前面的41bit 为ms时间,后面12bit为序号,所以1m最多生成
2
12
2^{12}
212 4096个ID
实现也很简单,比如:
https://blog.csdn.net/yuanyuanispeak/article/details/54969029
官方的链接:
https://github.com/twitter/snowflake
mongo
的ObjectId
的实现和snowflake
很像,不过前面的时间是秒级别的,后面24位的序列号,其实容量是要比snowflake 更大的
和uuid 比较
相同:
- 同样是内存生成,不需要依赖数据库等其他东西
- 同样满足分布式唯一
不同:
uuid 无序,snowflake 趋势递增
snowflake 个适合作为数据库的主键(索引?)
snowflake 时间回拨时,有可能发生重复
思考
感觉snowflake的会有的一些问题:
1.由于服务器时间并不是完全同步,所以虽然对单台服务器来说ID是递增的,但不同服务器间生成的ID并不是随时间递增的。
2.服务器时间回拨(如果服务器时间差别过大,会使用授时服务调整服务器时间),可能会引起ID 重复,解决方法可以是:
- 回拨后使用不同的机器Id
- 停止服务一段时间,比如回报100ms,则服务停止100ms
参考:
漫画:什么是SnowFlake算法?
https://jiasule.v2ex.com/t/430285
http://www.cnblogs.com/haoxinyue/p/5208136.html
https://tech.meituan.com/MT_Leaf.html (美团的这篇,稍微有些不好懂,建议看完上面两篇再看)