springboot分布式全局唯一id的生成-雪花算法snowflake

健康平安的活着 健康平安的活着     2023-01-28     783

关键词:

一 背景描述

1.1 问题产生

在分布式系统中,怎么使用全局唯一id?

在分布式是,微服务的架构中,或者大数据分库分表中,多个不同节点怎么保持每台机器生成的主键id不重复,具有唯一性?

  1. 方案1:mysql的自增主键; 设定一定的步长;如3台机器,3台节点初始值1,2,3,步长为3;机器A:1,4,7,10;机器B:2,5,8,11; 机器c:3,6,9,12
  2. 方案2:使用uuid,无序且生成的串比较长,与mysql官方建议尽量使用较短的字符串冲突
  3. 使用redis的原子性性产生主键,但是使用过程前期比较麻烦,需要搭建配置一堆东西。

这时,雪花算法是其中一个用于解决分布式 id 的高效方案,也是许多互联网公司在推荐使用的。

二 雪花算法

2.1 雪花算法

雪花算法:解决分布式高并发集群中,提供产生全局唯一的id,就是生成一个的 64 位比特位的 long 类型的唯一 id

2.2 雪花算法的结构

最高 1 位固定值 0,因为生成的 id 是正整数,如果是 1 就是负数了。

接下来 41 位存储毫秒级时间戳,2^41/(1000*60*60*24*365)=69,大概可以使用 69 年。

再接下 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。

最后 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。

 2.3 雪花算法的使用

可以将雪花算法作为一个单独的服务进行部署,然后需要全局唯一 id 的系统,请求雪花算法服务获取 id 即可。例如机房号+机器号,机器号+服务号,或者是其他可区别标识的 10 位比特位的整数值都行。

2.4 案例

 2.5 优缺点

优点:

高并发分布式环境下生成不重复 id,每秒可生成百万个不重复 id。

基于时间戳,以及同一时间戳下序列号自增,基本保证 id 有序递增。

般分布式ID只要求趋势递增,并不会严格要求递增,90%的需求都只要求趋势递增)

缺点:

服务器时钟回拨时可能会生成重复 id解决办法:

百度开源的分布式唯一ID生成器UidGenerator

Leaf-- 美团点评分布式ID生成系统

springboot分布式全局唯一id的生成-雪花算法snowflake

一背景描述1.1问题产生在分布式系统中,怎么使用全局唯一id?在分布式是,微服务的架构中,或者大数据分库分表中,多个不同节点怎么保持每台机器生成的主键id不重复,具有唯一性?方案1:mys... 查看详情

分布式场景全局唯一id生成工具类(非雪花算法)(代码片段)

这是一个分布式场景下全局唯一ID生成工具,类似于雪花算法(SnowFlake)。如果你需要生成订单号等类似前缀+yyMMddHHmmss+序列格式的全局唯一性序列可以使用。结构前缀yyMMddHHmmssworkerId序列ID优点与雪花算法一样,单机... 查看详情

分布式场景全局唯一id生成工具类(非雪花算法)(代码片段)

这是一个分布式场景下全局唯一ID生成工具,类似于雪花算法(SnowFlake)。如果你需要生成订单号等类似前缀+yyMMddHHmmss+序列格式的全局唯一性序列可以使用。结构前缀yyMMddHHmmssworkerId序列ID优点与雪花算法一样,单机... 查看详情

基于分布式锁分布式全局唯一id

...p; 源码:https://github.com/twitter-archive/snowflakeViewCode springboot 集成雪花算法:引入糊涂工具包 5.其他百度开源的分布式唯一ID生成器UidGenerator、美团开源的subtopic 查看详情

分布式全局唯一id解决方案(雪花算法)(代码片段)

文章目录为什么需要分布式全局唯一ID以及分布式ID的业务需求为什么无序的UUID会导致入库性能变差呢?数据库自增ID机制适合作分布式ID吗Redis集群实现分布式ID的利弊雪花算法(SonwFlake)使用糊涂工具包实现雪花算法优缺点:为... 查看详情

分布式全局唯一id解决方案(雪花算法)(代码片段)

文章目录为什么需要分布式全局唯一ID以及分布式ID的业务需求为什么无序的UUID会导致入库性能变差呢?数据库自增ID机制适合作分布式ID吗Redis集群实现分布式ID的利弊雪花算法(SonwFlake)使用糊涂工具包实现雪花算法优缺点:为... 查看详情

分布式全局唯一id解决方案(雪花算法)(代码片段)

文章目录为什么需要分布式全局唯一ID以及分布式ID的业务需求为什么无序的UUID会导致入库性能变差呢?数据库自增ID机制适合作分布式ID吗Redis集群实现分布式ID的利弊雪花算法(SonwFlake)使用糊涂工具包实现雪花算法优缺点:为... 查看详情

雪花算法(代码片段)

在分布式场景中,如何生成一个全局的唯一ID?由于是通过多台机器并行运算,因此一般的时间戳、UUID都不是很可靠。为此,Twitter提出了一种名为“雪花算法”的算法来生成分布式全局唯一ID的算法算法介绍“雪花算法”生成的... 查看详情

雪花算法中机器id保证全局唯一(代码片段)

关于分布式id的生成系统,美团技术团队之前已经有写过一篇相关的文章,详见 Leaf——美团点评分布式ID生成系统通常在生产中会用Twitter开源的雪花算法来生成分布式主键雪花算法中的核心就是机器id和数据中心id,通常来... 查看详情

雪花算法:分布式唯一id生成利器(代码片段)

前言无论是在分布式系统中的ID生成,还是在业务系统中请求流水号这一类唯一编号的生成,都是软件开发人员经常会面临的一场景。而雪花算法便是这些场景的一个解决方案。以分布式ID为例,它的生成往往会在唯... 查看详情

雪花算法(snowflake)

简介现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中id的全局唯一性。对于MySQL而言,一个表中的主键id一般使用自增的方式,但是如果进行水平分表... 查看详情

常见分布式全局唯一id生成策略

全局唯一的ID几乎是所有系统都会遇到的刚需。这个id在搜索,存储数据,加快检索速度等等很多方面都有着重要的意义。工业上有多种策略来获取这个全局唯一的id,针对常见的几种场景,我在这里进行简单的总结和对比。 简... 查看详情

2022年雪花算法的最大与最小值

参考技术A最高1位固定值0。雪花算法,SnowFlake算法,是Twitter开源的分布式id生成算法。其核心思想就是:使用一个64bit的long型的数字作为全局唯一id。最高1位固定值0,因为生成的id是正整数,如果是1就是负数了。 查看详情

分布式系统的唯一id如何生成(代码片段)

...花算法的概述雪花算法(snowflake)是Twitter开源的分布式ID生成算法,它会返回一个long类型的唯一ID。这种方案大致来说是一种以划分命名空间来生成ID的一种算法,这种方案把32或64-bit分别划分成多段,分开来... 查看详情

分布式系统的唯一id如何生成(代码片段)

...花算法的概述雪花算法(snowflake)是Twitter开源的分布式ID生成算法,它会返回一个long类型的唯一ID。这种方案大致来说是一种以划分命名空间来生成ID的一种算法,这种方案把32或64-bit分别划分成多段,分开来... 查看详情

雪花算法源码

参考技术A(1)开源ID:Twitter开源开源的分布式ID生成算法(2)64bit自增:使用一个64位的long型数字作为一个全局ID,且引入了时间戳概念,基本上保证自增的(3)64位中,第一位是不用的,其中的41位作为毫秒数,10位(5+5)作为机房机器id,剩下的12位... 查看详情

架构设计|分布式业务系统中,全局id生成策略(代码片段)

...,仅供参考。二、雪花算法1、概念简介Twitter公司开源的分布式ID生成算法策略,生成的ID遵循时间的顺序。1为位标识,始终为0,不可用;41位时间截,存储时间截的差值(当前时间截-开始时间截);10位的机器标识,10位的长度... 查看详情

架构设计|分布式业务系统中,全局id生成策略(代码片段)

...,仅供参考。二、雪花算法1、概念简介Twitter公司开源的分布式ID生成算法策略,生成的ID遵循时间的顺序。1为位标识,始终为0,不可用;41位时间截,存储时间截的差值(当前时间截-开始时间截);10位的机器标识,10位的长度... 查看详情