设计思想赏析-分布式id生成算法-雪花算法

简介: 设计思想赏析-分布式id生成算法-雪花算法

唯一ID怎么生成?

在数据库的使用中,根据第二范式的设计准则:数据库中的每行必须可以被唯一的区分,因此我们经常需要生成唯一id。在RDBMS(关系数据库管理系统)时代,数据库提供序列生成器,例如oracle的sequence,mysql的increment自增长字段等。RDBMS是中心化环境(单机环境),全局唯一只需要当前机器自己说了算就行;但是在分布式环境(去中心化)下,多台主机并存,如何让他们自动生成全局不会重复的id呢?


主要的解决方案有以下两类

法一:仍然采用中心化的思路

   在RDBMS中预生成一批序列,分布式环境中的每个节点启动时到RDBMS中获取一个号段,各自使用。美团leaf的Segment模式就属于此类型。


方法二:采用去中心化的思想

    约定一个规则,分布式环境中的每个节点自己生成全局唯一的id即可。UUID、GUID、雪花算法都属于此类情况。

雪花算法

     其实很多创新方法都非常简单,雪花算法也是如此。我们需要学习其设计思想,在分布式环境中的id都可以套用此方法。

雪花算法是由Twitter开源的,设定64个bit【思考:为什么是64位?】,由首位、时间戳、机器id和自增序列四部分组成。

  • 首位,1个bit,固定为0;【思考:为什么首位为0?】
  • 时间戳,41个bit,当前时间与指定日期的毫秒级时间差;【思考:为什么是时间差?】
  • 集群节点id,10个bit,最多2^10,共计1024台机器;
  • 自增序列,12个bit,最多2^12,共计4096个id。

天下没有两片相同的雪花

    每个节点在生成id时,会因为时间戳和自增序列的不同,生成的id局部唯一;加上集群节点id,自然就做到了全局唯一,因此雪花算法做到了“天下没有两片相同的雪花”的目的。

    同时,时间戳按毫秒计,每毫秒最多可支持4096个id,因此,每个节点每秒可生成4096000个id,且生成的id在(2^41-1)/86400/365/1000=69年之后才会超出41位,应对多大的量都够用了。

设计核心

所以其设计的核心是:

1、  循环使用的自增id,保证某个时间内局部唯一;

2、毫秒级时间戳,提供秒级生成大量id,应对高请求;

3、集群节点id,保证全局唯一。

     设计思想明白了,就可以进行相应改良。例如百度的集群已经超过1024台了,那该怎么办?

     百度对雪花算法进行了调整,他的uid是1bit首位+28bit时间戳+22bit机器id+13bit序列号。所以百度uid支持2^22=4194304个节点,每个节点每个秒可生成2^13=8192个id。但是时间戳变短了,只能支持到秒级,所以这个算法生成的id,在(2^28-1)/86400/365=8.5年之后就会超出28bit的长度。

     所以,百度的同学,你准备8年半之后要干啥?


拓展:雪花算法会遇到什么问题?有什么解决办法?还可以应用在哪个场景?

相关文章
|
7天前
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
19 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
|
21天前
|
NoSQL 算法 关系型数据库
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
本文详解分布式全局唯一ID及其5种实现方案,关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式 ID 详解 ( 5大分布式 ID 生成方案 )
|
19天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
19天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
算法
基于粒子群算法的分布式电源配电网重构优化matlab仿真
本研究利用粒子群算法(PSO)优化分布式电源配电网重构,通过Matlab仿真验证优化效果,对比重构前后的节点电压、网损、负荷均衡度、电压偏离及线路传输功率,并记录开关状态变化。PSO算法通过迭代更新粒子位置寻找最优解,旨在最小化网络损耗并提升供电可靠性。仿真结果显示优化后各项指标均有显著改善。
|
3月前
|
SQL 算法 Serverless
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
28 1
|
3月前
|
存储 算法 数据挖掘
技术分享:从雪花算法生成订单ID的抉择与反思
【8月更文挑战第17天】在软件开发的浩瀚征途中,技术选型如同航海中的罗盘,指引着项目前进的方向。今天,我想与大家分享一段关于“用雪花算法生成订单ID,现在我有点后悔了”的亲身经历,希望通过这段故事,为大家在技术选型时提供一些参考与启示。
89 0
|
27天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
12天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
13天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。