snowflake雪花算法分布式实现全局id生成(代码片段)

binhome binhome     2023-05-03     272

关键词:

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。

这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等。

其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号,最后还有一个符号位,永远是0。

比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示:

技术图片

整个结构是64位,所以我们在Java中可以使用long来进行存储。 该算法实现基本就是二进制操作,单机每秒内理论上最多可以生成1024*(2^12),也就是409.6万个ID(1024 X 4096 = 4194304)

0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 

    1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
    41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
    10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId。10-bit机器可以分别表示1024台机器。如果我们对IDC划分有需求,还可以将10-bit分5-bit给IDC,分5-bit给工作机器。这样就可以表示32个IDC,每个IDC下可以有32台机器,可以根据自身需求定义。
   12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号。12个自增序列号可以表示2^12个ID,理论上snowflake方案的QPS约为409.6w/s,这种分配方式可以保证在任何一个IDC的任何一台机器在任意毫秒内生成的ID都是不同的。
   加起来刚好64位,为一个Long型。

 

优点:

  整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。

  • 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。
  • 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。
  • 可以根据自身业务特性分配bit位,非常灵活

缺点:

  • 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。

 

Go实现

  sonyflake

 

下载 

go get github.com/sony/sonyflake

 

Demo

package main

import (
	"fmt"
	"github.com/sony/sonyflake"
)

var (
	LSonyFlake *sonyflake.Sonyflake
	machineId  uint16 // 真正的分布式环境下必须zookeeper或etcd中获取
)

func getMachineID() (uint16, error) 
	return machineId, nil

func Init(mid uint16) (err error) 
	machineId = mid
	st := sonyflake.Settings
	st.MachineID = getMachineID
	LSonyFlake = sonyflake.NewSonyflake(st)
	return

func GetID()(id uint64,err error)  
	if LSonyFlake == nil
		err = fmt.Errorf("No Init
")
		return
	
	return LSonyFlake.NextID()


func main()  
	Init(0)
	id,err:=GetID()
	if err != nil 
		fmt.Println(err)
	
	fmt.Println(id)

  

 

 

 

 

id生成算法-雪花算法(snowflake)及代码实现(代码片段)

...、java实现结尾前言唯一ID可以标识数据的唯一性,在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种:依赖数据库,使用如MySQL自增列或Oracle序列等。UUID随机数snowflake雪花算法(本文将要讨论)一... 查看详情

分布式id理解snowflake算法的实现原理(代码片段)

...owflake算法的实现原理我上次也看了一个视频讲解:【分布式ID】键高并发分布式全局唯一ID雪花算法snowflake2.前提#Snowflake(雪花)是Twitter开源的高性能ID生成算法(服务)。上图是Snowflake的Github仓库,mas 查看详情

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

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

雪花算法(snowflake)

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

雪花算法原理和实现

...50010830/article/details/89845790SnowFlake算法,是Twitter开源的分布式id生成算法。其核心思想就是:使用一个64bit的long型的数字作为全局唯一id。在分布式系统中的 查看详情

雪花算法原理和实现

...50010830/article/details/89845790SnowFlake算法,是Twitter开源的分布式id生成算法。其核心思想就是:使用一个64bit的long型的数字作为全局唯一id。在分布式系统中的 查看详情

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

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

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

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

雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论(代码片段)

...题3、等待时钟校正五、要点总结一、前言在日趋复杂的分布式系统中,数据量越来越大ÿ 查看详情

分布式id生成方案:雪花算法(源自twitter)

参考技术A雪花(snowflake)在自然界中,是极具独特美丽,又变幻莫测的东西:雪花算法的原始版本是scala版,用于生成分布式ID(纯数字,时间顺序),订单编号等。算法描述:snowflake.gomain.go测试结果:结论: 查看详情

twitter的分布式自增id算法snowflake(java版)

什么是雪花算法?雪花算法(Snowflake)是一种经典的分布式ID生成算法。在分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序... 查看详情

id号生成雪花算法

...生成2、SnowFlake算法生成id的结果是一个64bit大小的整数3、分布式系统内不会产生重复id(用有datacenterId和machineId来做区分)datacenterId(分布式)(服务ID1,2,3.....)每个服务中写死machineId(用于集群)机器ID读取机器的环境变量M... 查看详情

分布式id生成方案-snowflake算法(代码片段)

...a;【码农在新加坡】,欢迎关注。个人博客网站:分布式ID生成方案-snowflake算法背景在互联网的业务系统中,涉及到各种各样的ID,这些ID需要保证全局唯一。我们称之为分布式ID,分布式ID需要满足唯一性、趋... 查看详情

snowflake雪花算法详解与实现(代码片段)

...实现算法验证算法优缺点注意事项背景现在的服务基本是分布式,微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中id的全局唯一性。对于MySQL而言ÿ 查看详情

springboot中使用雪花算法生成雪花id(代码片段)

...生成全局唯一ID的算法,由Twitter公司开发。它可以在分布式系统中生成全局唯一的ID,解决分布式系统中的数据合并和分片等问题。雪花算法生成的ID是一个64位的长整型数字,由以下部分组成:1个bit:符号位&... 查看详情

分布式id生成方案-snowflake算法(代码片段)

...各种各样的ID,这些ID需要保证全局唯一。我们称之为分布式ID,分布式ID需要满足唯一性、趋势递增性、高可用性、高性能等特点。snowflake算法,也叫雪花算法,是其中的一种分布式ID生成方案。是twitter公司内部... 查看详情

雪花算法原理解析(代码片段)

分布式ID常见生成策略:  分布式ID生成策略常见的有如下几种:数据库自增ID。UUID生成。Redis的原子自增方式。数据库水平拆分,设置初始值和相同的自增步长。批量申请自增ID。雪花算法。百度UidGenerator算法(基于雪花算法实... 查看详情

分布式id生成方案-snowflake算法(代码片段)

...各种各样的ID,这些ID需要保证全局唯一。我们称之为分布式ID,分布式ID需要满足唯一性、趋势递增性、高可用性、高性能等特点。snowflake算法,也叫雪花算法,是其中的一种分布式ID生成方案。是twitter公司内部... 查看详情