本发明专利技术提供一种分布式全局唯一ID应用方法,包括以下两种类型:字符串类型的全局唯一ID,能够在没有网络情况下本地高效生成时间友好的全局唯一ID;数值型全局唯一ID,需要有网络通讯这一前提,从远程服务器获取数值型、时间友好的全局唯一ID;生成数值型全局唯一ID时,整个服务分为服务端生成ID机器集群和客户端,所述服务端生成唯一ID的机器,首先需要根据机器mac地址去MySQL数据库集群进行注册,获取服务机器唯一编号,保证服务端各个机器生成ID唯一;客户端通过增加缓存使得用户请求无感知。客户端和服务器通过HTTP请求进行数据交互。本发明专利技术实现了在不同ID类型需求场景下,高效的产生全局唯一ID的一套方案。
【技术实现步骤摘要】
本专利技术涉及一种分布式系统中全局唯一ID服务,特别是涉及需要一种能够高效地产生全局唯一ID的布式系统
技术介绍
在分布式系统中,经常需要使用全局唯一ID(GUID)定义对应的数据。GUID的基本需求包括以下几点:1、全局唯一;2、占用相对较少,方便DB存储和索引;3、时间友好,方便业务查询;4、性能高,可用性高。当前现有解决方案都存在各自的问题,没有一种比较全面的方案。关于SnowFlake,因本专利技术的实现基于Twitter公司的Snowflake方案,故先介绍一下snowflake,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的ID,这些ID还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的ID必须不同,Twitter研发了snowflake生成ID方案.其核心思想是:产生一个long型的ID,使用其中41位(bit)作为时间戳(单位:毫秒),10bit作为机器编号,12bit作为序列号。如图1所示:除了最高位(bit)标记为不可用以外,其余三组bit占位均可浮动,应具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用69.7年,10bit的工作机器id可以支持1024台机器,序列号支持1毫秒产生4096个自增序列id。下面详细介绍一下各个段作用。SnowFlake—时间戳时间戳(time)—41bit,这里时间戳的细度是毫秒级,默认情况下有41个bit可以供使用,那么一共有T(1<<41)毫秒可以使用分配,年份=T/(3600*24*365*1000)=69.7年。也就是说snowflake能够保证69.7年不会产生相同的ID。同理,如果只给时间戳分配39个bit使用,那么根据同样的算法最后年份=17.4年。SnowFlake—工作机器ID工作机器ID(machineid)—10bits,该部分其实由数据中心ID(datacenterId)和工作ID(workerId)两部分组成,来唯一标示一台生成snowflake的机器。Twitter这块通过zookeeper来保证序列的唯一。我们方案中把这部分作为一个整体来看待。SnowFlake—序列号序列号就是一系列的自增id(多线程建议使用atomic),为了处理在同一毫秒内需要给多条消息分配id,若同一毫秒把序列号用完了,则“等待至下一毫秒”。sequenceid—12bits,该id可以表示4096个数字,它是在time相同的情况下,递增该值直到为0,即一个循环结束,此时便只能等到下一个ms到来,一般情况下4096/ms的请求是不太可能出现的,所以足够使用了。
技术实现思路
本专利技术提供了一种分布式全局唯一ID应用方法,是在现有SnowFlake技术基础上,改进并实现的一种不需要联网、高效的本地生成字符串型全局唯一ID的方案。同时也提供了远程数值型全局唯一ID生成方案,作为字符串型全局唯一ID生成方案的有力补充。现在需要考虑的是如何生成本地ID和远程获取ID的问题:本地生成字符串类型全局唯一ID方案最需要解决的问题是如何保证服务器之间在不进行通讯的前提下,生成互不相同的ID。远程获取数值型全局唯一ID方案中,现行SnowFlake方案需要引入分布式协调服务Zookeeper(分布式协调服务)来控制每台工作机器都被分配唯一的工作编号(workID),确保不同机器上通过相同逻辑生成唯一编号不冲突。但zookeeper服务相对而言比较重,需要一种更轻量的方式来高效的分配唯一编号,所以我们需要解决如何在没有zookeeper集群前提下,高效给服务器分配唯一工作编号(workID)的问题。远程获取数值型全局唯一ID方案中,因每次请求都需要一次网络请求开销。对于用户响应要求高,或者全局唯一ID需求密集的场景下,这个开销时不能容忍的。所以需要解决如何在尽量用户无感知情况下获取远程服务器产生的全局唯一ID的问题。针对以上产生的问题,本专利技术提出了相应的解决方案。本地生成字符串类型全局唯一ID方案:现有snowflake方案,有对网络和远程服务都是强依赖的致命缺点。为了解决这个问题,我们推出的本地生成字符串类型全局唯一ID方案,可以不依赖网络,完全在本地生成全局唯一ID,生成的ID是字符串类型的。远程获取数值型全局唯一ID方案:因字符串型全局唯一ID方案只能生成字符串类型ID,对于现有遗留数值型ID系统或者确实需要数值型全局唯一ID的场景无能为力。所以我们提供了远程HTTP访问获取数值型全局唯一ID的方案。其技术方案如下所述:一种分布式全局唯一ID应用方法,包括以下两种类型:字符串类型的全局唯一ID,能够在没有网络情况下本地高效生成时间友好全局唯一ID,所述生成时间友好是指生成时间晚的ID要大于生成时间早的ID,便于按照时间范围查找;数值型全局唯一ID,需要有网络通讯这一前提,从远程服务器获取数值型、时间友好的全局唯一ID;生成数值型全局唯一ID时,整个服务分为服务端生成ID机器集群和客户端。服务端生成唯一ID的机器,首先需要根据机器mac地址去MySQL数据库集群进行注册,获取服务机器唯一编号,保证服务端各个机器生成ID唯一,使其和其他机器不冲突。客户端通过增加缓存使得用户请求无感知,客户端和服务器通过HTTP请求进行数据交互。本地生成的字符串类型全局唯一ID,由110位数据组成,包括最高48位的时间位、中间48位的机器唯一标示位、最低14位的序列号位,并通过32进制编码将数据压缩成一个22字符长度的字符串,实现在无网络环境下生成短小无特殊字符全局唯一ID。远程获取的数值型全局唯一ID通过MySQL数据库的自增主键和唯一主键进行处理,服务启动时,本方法根据机器mac地址去MySQL数据库集群进行注册,如果此mac地址已经注册过,则直接返回该机器已经注册过得编号;如果发现没有注册过,则插入一条记录,并返回id作为编号,从而使每台电脑都能得到一个唯一的编号。远程获取的数值型全局唯一ID使用户请求无感知,通过在客户端增加缓存,每次请求都从服务器端批量获取数据,做到在现多线程情况下远程调用无感知的获取全局唯一ID。所述客户端设有一个缓存队列,并单独使用一个worker线程请求服务端获取全局ID,消费线程每消费一个,worker线程就会往缓存队列里面放一个;当worker线程出现网络异常时,会首先进行重试,多次尝试依然失败后,会往缓存队列里面存放特殊岗哨对象,用于代表出现问题的标示,当消费线程发现获取的是特殊岗哨对象时,则说明work线程出现异常,然后通知上层调用者。所述缓存的大小能够进行调整,最小能够调整为0,代表不使用缓存。远程获取的数值型全局唯一ID中,共41位,第一位保持代表正数的0,依次包括41位时间戳、10位workID、12位序列号位。所述序列号为初始随机、顺序递增形式,当服务器出现时间回退时,生成序列号时间不会回退,会继续使用上一次使用最晚时间;当一毫秒以内序列号大于最大标示4096以后,会使用下一毫秒的序列号,毫秒数会加一,序列号继续从0开始。在连不到网络的测试环境中或者为了兼容以前数值类型的ID,还能够采用远程HTTP请求方式获取唯一ID,远程HTTP请求方式获取的唯一I本文档来自技高网...
【技术保护点】
一种分布式全局唯一ID应用方法,包括以下两种类型:字符串类型的全局唯一ID,能够在没有网络情况下本地高效生成时间友好的全局唯一ID;数值型全局唯一ID,需要有网络通讯这一前提,从远程服务器获取数值型、时间友好的全局唯一ID;生成数值型全局唯一ID时,整个服务分为服务端生成ID机器集群和客户端,所述服务端生成唯一ID的机器,首先需要根据机器mac地址去MySQL数据库集群进行注册,获取服务机器唯一编号,保证服务端各个机器生成ID唯一;客户端通过增加缓存使得用户请求无感知。客户端和服务器通过HTTP请求进行数据交互。
【技术特征摘要】
1.一种分布式全局唯一ID应用方法,包括以下两种类型:字符串类型的全局唯一ID,能够在没有网络情况下本地高效生成时间友好的全局唯一ID;数值型全局唯一ID,需要有网络通讯这一前提,从远程服务器获取数值型、时间友好的全局唯一ID;生成数值型全局唯一ID时,整个服务分为服务端生成ID机器集群和客户端,所述服务端生成唯一ID的机器,首先需要根据机器mac地址去MySQL数据库集群进行注册,获取服务机器唯一编号,保证服务端各个机器生成ID唯一;客户端通过增加缓存使得用户请求无感知。客户端和服务器通过HTTP请求进行数据交互。2.根据权利要求1所述的分布式全局唯一ID应用方法,其特征在于:本地生成的字符串类型全局唯一ID,由110位数据组成,包括最高48位的时间位、中间48位的机器唯一标示位、最低14位的序列号位,并通过32进制编码将数据压缩成一个22字符长度的字符串,实现在无网络环境下生成短小无特殊字符全局唯一ID。3.根据权利要求1所述的分布式全局唯一ID应用方法,其特征在于:远程获取的数值型全局唯一ID通过MySQL数据库的自增主键和唯一主键进行处理,服务启动时,本方法根据机器mac地址去MySQL数据库集群进行注册,如果此mac地址已经注册过,则直接返回该机器已经注册过得编号;如果发现没有注册过,则插入一条记录,并返回id作为编号,从而使每台电脑都能得到一个唯一的编号。4.根据权利要求1所述的分布式全局唯一ID应用方法,其特征在于:远程获取的数值型全局唯一ID使用户请求无感知,通过在客户端增加缓存,每次请求都从服务器端批量获取数据,做到在现多线程情况下远程调...
【专利技术属性】
技术研发人员:张若飞,王浩,孟烨,
申请(专利权)人:宜人恒业科技发展北京有限公司,
类型:发明
国别省市:北京;11
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。