根据维基百科的定义:雪花算法(Snowflake)是一种生成分布式全局唯一ID的算法。有句老话说得好,这个世界上不存在两片完全相同的雪花。雪花算法主要的作用就是生成分布式全局唯一ID。比如推特把雪花算法使用在推特的推文ID。
这个时候有人问了,假设我有一个电商系统,每天都有好几十个人下单,电商系统的单号明显是需要唯一的,这种场景下我需要用雪花算法吗?
如果没有雪花算法的话,程序员的世界会变成什么样子?一片荒芜?还是一切如故。对不起文艺病犯了。要知道,根据可靠的情报(wikipedia),雪花算法是2010年Twitter发布的,这并不意味着2010年前大家不需要分布式唯一ID了,这就和野生大熊猫在外面有野人喂是一个道理,实际上还是有很多的方案的,最常见的方案主要是这两种:
当我们需要唯一ID的时候,我们大多数人的第一反应可能就是MySQL的自增ID,主要的优缺点如下:
相信对于后端开发的同学来说对UUID并不陌生,这里援引wiki百科的介绍:
使用python可以很方便的生成一个uuid:
importuuidprint(uuid.uuid4())#7330e875-b2e9-4ac9-89b8-b03bd4a7f73aUUID的优缺点也很明显。
终于步入正题了,尽管我们上诉两种方案都有明显的缺点,但是在业务量没那么大的情况下,这些缺点是完全可以接受的,所以在业务规模并不是十分巨大(十亿,百亿,千亿...)级的时候,使用UUID和MySQL时更加合适的选择。但是业务规模特别大的时候,MySQL和UUID的缺点就比较致命了,这个时候就需要使用分布式的ID生成算法了,最经典的就是雪花算法。
这里引用wiki百科的定义:
结合经典的雪花ID图和定义,我们来简单概要的总结一波雪花算法的特征。
到这里雪花算法的理念部分就讲完了,接下来附Python代码的实现,感兴趣的可以看下: