本发明属于数据处理,特别是涉及一种集群分布式架构全局唯一id生成的方法及系统。
背景技术:
1、在集群分布式架构中,每个服务都是独立的,拥有自己的数据库和数据模型。这种架构使得系统更容易扩展、更灵活,但是却带来了一些新的问题。其中之一就是需要确保每个服务中分别创建的表、记录等,在全局范围内的唯一性。这意味着每个服务都需要能够生成一个唯一的id来标识自己所创建的数据。传统的数据库中一般使用自增长的方式来生成id。但是在分布式架构中,每个服务都可能会独立地创建新的记录,在这种情况下,自增长的方式就不能确保全局唯一性。因此需要一种更为精细的id生成方式,来确保全局唯一性。
2、目前,常用的全局唯一id生成方式有两种:uuid和snowflake。uuid是一种无序、随机的id生成方式,可以任何地方生成一个唯一的id,而snowflake则是一种有序的id生成方式,它包含一个时间戳和一些序列号,可以保证在同一时刻生成的id是有序的,并且在不同的时刻生成的id也是不同的。但是目前常用的全局唯一id生成方式存在有如下问题:
3、(1)id生成和使用大多与具体数据库有关,需要相关数据库支持,通用性和灵活性相对较低;
4、(2)最终生成的全局唯一id为32位十六进制数或64位整数,整体来说较长,可读性较差,占用更多的存储空间;
5、(3)时间戳精确到毫秒,比精确到秒的时间戳占用更多的存储空间,对系统的时间同步要求更高,可能受到系统时钟回拨的影响导致生成的id不再是全局唯一的。
6、因此,我们需要开发出一种集群分布式架构全局唯一id生成的方法及系统,能生成的全局唯一id所需位数更少,时间精确到秒不会时间回拨,id生成与具体数据库无关,有序且保证生成的id是全局唯一的不发生重复。
技术实现思路
1、本发明的目的在于提供一种集群分布式架构全局唯一id生成的方法及系统,以解决上述背景技术中提到的现有全局唯一id生成方法生成的id较长,可能存在时间回拨等问题。
2、为实现上述目的,本发明提供一种集群分布式架构全局唯一id生成的方法,所述方法具体如下:
3、获取服务标识序列:服务启动时,系统通过服务标识序列中心为所述服务分配服务标识序列;
4、生成全局唯一id:拥有所述服务标识序列后,所述服务请求所述系统为其根据编码规则分配全局唯一id;
5、续约服务标识序列:当服务定时任务判断所述服务标识序列将要过期时,所述服务标识序列中心为所述服务标识序列续期;
6、释放过期服务标识序列:通过所述服务标识序列中心定期清理过期的所述服务标识序列。
7、优选地,所述编码规则,包括三个id部分的规则:表示时间部分、表示服务标识序列部分、表示自增序列部分;其中所述表示时间部分由所述服务标识序列中心来生成,所述编码规则为使用a位十进制数来表示时间上不重复的秒数。
8、优选地,所述表示服务标识序列部分通过所述服务标识序列中心来分配,编码规则为:使用b位二进制数来表示不同的服务器序列。
9、优选地,所述表示自增序列部分由所述服务自己生成,编码规则为:使用c位二进制数来表示所述表示自增序列部分的id。
10、优选地,所述生成所述服务最终的所述全局唯一id,具体包括:
11、所述生成所述服务最终的所述全局唯一id,由全局唯一id生成器来完成,具体包括:
12、获取并根据所述服务标识序列中心的当前时间戳、所述服务的当前时间戳,得到校对时长、当前秒数,并将所述当前秒数的结果不大于a位数字,作为所述全局唯一id的时间部分,即所述全局唯一id的前面a位数字;
13、将所述表示服务标识序列部分加上所述表示自增序列部分后转换成十进制数作为所述全局唯一id的后面d位数字,不够d位数字时左边补0,完成所述全局唯一id即e位十进制数的生成。
14、优选地,所述通过服务标识序列中心为所述服务分配服务标识序列,具体为:
15、通过所述服务标识序列中心传入所述服务的ip及端口号作为所述服务的服务标识参数;
16、所述服务标识序列中心在服务标识哈希表里查看所述服务是否已分配过所述服务标识序列,若是,则更新所述服务标识序列的过期时间,向过期链表表尾插入所述服务标识序列的节点数据,返回所述服务标识序列给所述服务;
17、若不是,则顺序查找标识序列数组中下标第一个数据为空的位置作为所述服务标识序列,采用cas更新下标数据,在所述服务标识哈希表中插入所述服务标识序列的信息,向所述过期链表增加所述服务标识序列的所述节点数据,返回所述服务标识序列号给所述服务。
18、优选地,所述续约服务标识序列,具体包括:
19、当收到所述服务的续约请求时,所述服务标识序列中心在所述服务标识哈希表里查看所述服务是否已分配过所述服务标识序列,若不是,则返回续期失败;
20、若是,则把所述服务标识序列的最新过期时间更新到所述服务标识哈希表,向所述过期链表表尾插入所述服务标识序列的所述节点数据,返回所述服务标识序列给所述服务。
21、优选地,所述释放服务标识序列,具体包括:
22、从所述过期链表表头开始取出所述服务标识序列的所述节点数据,直到过期时间大于当前系统时间时停止取出操作;
23、所述取出所述服务标识序列的所述节点数据后移除所述节点,通过所述服务标识序列中心查询所述服务标识哈希表,判断所述节点的所述过期时间是否小于所述当前时间,若是,删除所述服务标识哈希表里所述服务的所述服务标识参数,清空所述服务标识序列对应的所述标识序列数组里的所述下标数据,若否,则跳过不作任何处理。
24、所述服务标识哈希表:存放key为所述服务标识参数,value为所述服务标识标识序列和所述过期时间;
25、所述标识序列数组:为字符串数组,所述字符串数组的所述下标数据代表所述服务标识序列,数组内容为所述服务标识参数;
26、所述过期链表:所述节点数据越靠近表头则离所述服务过期时间越短,越靠近表尾则离所述服务过期时间越长。
27、另外,本发明还提供一种集群分布式架构全局唯一id生成的系统,所述系统具体包括:
28、服务标识序列模块,用于服务启动时,系统通过服务标识序列中心为所述服务分配服务标识序列;
29、生成全局唯一id模块,用于拥有所述服务标识序列后,所述服务请求所述系统为其根据编码规则分配全局唯一id;
30、服务标识序列续约模块,用于当服务定时任务判断所述服务标识序列将要过期时,所述服务标识序列中心为所述服务标识序列续期;
31、过期服务标识序列释放模块,用于过所述服务标识序列中心定期清理过期的所述服务标识序列。
32、优选地,所述服务标识序列模块包括:
33、服务标识参数单元,用于通过所述服务标识序列中心传入所述服务的ip及端口号作为服务标识参数;
34、服务标识序列分配单元,用于通过所述服务标识序列中心在服务标识哈希表里查看所述服务是否已分配过所述服务标识序列,分配过则进行更新,没分配过则进行分配。
35、优选地,所述生成全局唯一id模块包括:
36、时间部分生成单元,用于根据编码规则生成全局唯一id的时间部分;
37、服务标识序列部分生成单元,用于根据编码规则生成全局唯一id的服务标识序列部分;
38、自增序列部分生成单元,用于根据编码规则生成全局唯一id的所述自增序列部分;
39、全局唯一id生成单元,用于根据时间部分生成单元、服务标识序列部分生成单元、自增序列部分生成单元得到的各个部分的id生成最终的全局唯一id。
40、本发明相对于现有技术具有如下的优点及效果:
41、(1)全局唯一id通过服务和服务标识序列中心来生成和使用,与具体数据库无关,不需要相关数据库支持,与数据库解耦,通用性和灵活性相对较高;
42、(2)最终生成的全局唯一id可以为16位十进制数,比现有的其他方案生成的全局唯一id短,能提高查询效率,适应分布式环境,可读性较高,占用空间小,节省存储空间,适应性更广,结合cas技术的应用,可以确保在高并发环境下生成的id的唯一性;
43、(3)时间戳精确到秒,比精确到毫秒的时间戳占用更少的存储空间,对系统的时间同步要求不需要精确到毫秒的时间戳,以服务序列中心的时间为准来校正本地服务的时间,不存在时间回拨问题,确保生成的id是全局唯一的。