snowflake雪花算法在实际项目中的应用

snowflake算法(雪花算法)介绍

引用百科:雪花算法 (SnowFlake ) 算法,是 Twitter 开源的分布式 id 生成算法。
有这么一种说法,自然界中并不存在两片完全一样的雪花的。每一片雪花都拥有自己漂亮独特的形状、独一无二。雪花算法也表示生成的ID如雪花般独一无二。
其核心思想是,使用一个64 bit 的 ong 型的数字作为全局唯一 g。在分布式系统中的应用十分广泛,具D引入了时间戳,基本上保技自增的。
这 64 个 bit 中,其中1个 bit 是不用的(我们生成的 id 都是正数,所以第一个 bit 统一都是 ),然后用其中的 41 bit 作为毫秒数,用10bit 作为工作机器 id,12 bit 作为序列号。

 按照上图理论:这个算法可以保证说,一个机房的一台机器上,在同一毫秒内,生成了一个唯一的 d。可能一个毫秒内会生成多个id,但是有最后12 个bt的序号来区分开来。

软件设计中的主键生成方案

  • 数据库自增长ID
优  点非常简单,有序递增,方便分页和排序。
缺  点分库分表后,同一数据表的自增ID容易重复,无法直接使用(可以设置步长,但局限性很明显);性能吞吐量整个较低,如果设计一个单独的数据库来实现 分布式应用的数据唯一性,即使使用预生成方案,也会因为事务锁的问题,高并发场景容易出现单点瓶颈。
适用场景

单数据库实例的表ID(包含主从同步场景),部分按天计数的流水号等;分库分表场景、全系统唯一性ID场景不适用。

  • Redis生成ID
优  点整体吞吐量比数据库要高。
缺  点Redis实例或集群宕机后,找回最新的ID值有点困难。
适用场景比较适合计数场景,如用户访问量,订单流水号(日期 流水号)等。
  • UUID、GUID生成ID
优  点不依赖任何数据源,自行计算,没有网络ID,速度超快,并且全球唯一。
缺  点没有顺序性,并且比较长(128bit),作为数据库主键、索引会导致索引效率下降,空间占用较多。
适用场景只要对存储空间没有苛刻要求的都能够适用,比如各种链路追踪、日志存储等。
  • snowflake算法(雪花算法)生成ID
优  点高性能、低延迟、去中心化、按时间有序
缺  点要求机器时钟同步(到秒级即可)
适用场景分布式应用环境的数据主键

互联网大厂中的应用实践

ecp-uid项目

Leaf用来生成全局的唯一ID,其中的Leaf-snowflake方案是雪花算法的改进版。

Leaf概述
        Leaf是基础研发平台推出的一个分布式ID生成服务,名字取自德国哲学家、数学家莱布尼茨的著名的一句话:“There are no two identical leaves in the world”(世间不可能存在两片相同的叶子)。

        Leaf 也提供了两种ID生成的方式,分别是 Leaf-segment 数据库方案和 Leaf-snowflake 方案。

        ecp-uid项目不但集成了现有的UidGenerator算法,原生的snowflake算法,还包含优秀的leaf segment算法

github:https://github.com/Meituan-Dianping/Leaf

uid-generator项目

UidGenerator项目基于snowflake原理实现,只是修改了机器ID部分的定义(实例重启的次数),并且64位bit的分配支持配置。

主要是先采用分批次获取ID

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值