​

本章内容:

  1. 什么是雪花算法

  2. 雪花算法原理

  3. 优秀的python库:pysnowflake

  4. 其他团队生成guid方案

********************************************

0. 场景描述:

  近期项目中,清洗数据时,由于数据量比较大(千万级),入库时,不打算用数据库自增ID作为某条记录的“唯一ID”,用UUID担心会有重复,于是开始寻找UUID的替代方案,了解到比较出名的“雪花算法”生成guid(全局唯一ID),发现有优秀的前辈已经替我们做了铺垫 ---pysnowflake 就是它!

1. 什么是雪花算法

  snowflake中文意思: 雪花,雪片,可以联想到下雪的时候,漫天雪花飞舞,意境之美,雪景无边无垠,自然界没有两片完全相同的雪花,可想作者对该算法给予的信心和希望。好在snowflake出身正统,生于twitter,在团队牛人的维护下,不断完善迭代,被广泛使用。雪花算法的原始版本是​​scala版​​,感兴趣的小伙伴可以了解下。 

  产生背景:twitter高并发环境下对唯一ID生成的需求。

  雪花算法有如下特点:

  该算法,属于半依赖数据源方式,原理是使用Long类型(64位),按照一定的规则进行填充:时间(毫秒级)+集群ID+机器ID+序列号,每部分占用的位数可以根据实际需要分配,其中集群ID和机器ID这两部分,在实际应用场景中要依赖外部参数配置或数据库记录。



--- 优点:高性能、低延迟、按时间有序、生成效率极高
--- 缺点:要求机器时钟同步(到秒级即可)
--- 适用场景:分布式应用环境的数据主键


顺便对比下:自增ID和一般GUID



--- 自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景。
--- GUID:采用无意义字符串,数据量增大时造成访问过慢,且不宜排序。


2. 雪花算法原理

python开发笔记 -- python基于“雪花算法”guid生成库_自增

  算法描述: 



--- 最高位1bit是符号位,始终为0,不可用。
--- 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
--- 10位的机器标识,10位的长度最多支持部署1024个节点。
--- 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。


3. 优秀的python库:pysnowflake

  安装 pysnowflake



pip install pysnowflake


  启动pysnowflake  ---pysnowflake基于Tornado开发,启动时相当于一个服务



snowflake_start_server \
--address=192.168.1.1 \
--port=8910 \
--dc=1 \
--worker=1 \
--log_file_prefix=/tmp/pysnowflask.log


  参数说明:可以通过--help查看



---address:本机的IP地址默认localhost
---dc:数据中心唯一标识符默认为0
---worker:工作者唯一标识符默认为0
---log_file_prefix:日志文件所在位置


  Mac环境启动:---不加任何参数,直接就启动了



snowflake_start_server


  CentOS下普通启动:



snowflake_start_server --address=127.0.0.1 --port=8910


   如果需要后台运行,参考:



nohup snowflake_start_server --address=127.0.0.1 --port=8910 --dc=1 --worker=1 --log_file_prefix=/tmp/pysnowflask.log>/dev/null &


  使用样例:



# 样例:4361106750091296769
import snowflake.client
def get_snowflake_uuid():
guid = snowflake.client.get_guid()
return guid
get_snowflake_uuid()


4. 其他团队生成guid方案 



--- 百度uid-generator:
https://gitee.com/mirrors/UidGenerator
https://github.com/baidu/uid-generator
--- Leaf—美团点评分布式ID生成系统:
https://tech.meituan.com/2019/03/07/open-source-project-leaf.html
https://tech.meituan.com/2017/04/21/mt-leaf.html  
--- 雪花算法SpringBoot版
https://gitee.com/darkranger/id-generator
--- 其他:
https://www.jianshu.com/p/1271babe6b08