UUID,是指通用唯一标识符,Universally Unique Identifier
。
首先说明一下题意,类似雪花算法(SnowFlake)这种方式,因为生成的结果长度是固定的(64bit),因此,只能产生有限个UUID。
如果要在一个大的集群,或者说全世界范围内产生足够多的UUID,可以怎么做呢?
-
第一步,假设有一个全局的Leader机(可以做成主备),它负责向各个一级机构(比如国家)批量分配连续的UUID。这里用String类型来表示一个10进制数,分配的时候指定开始值和分配数量即可。
-
第二步,二级机构(比如各个省、州、邦)可以向一级机构批量(开始序号+数量)申请UUID。一级机构如果剩余足够的UUID,则直接分配并返回,否则一级机构向全局Leader进行批量申请,申请到之后再向二级机构返回。
-
第三步,如上方式继续下分,直到市——县——镇(乡)——街道(村)——小区……
-
直到最下一级机构,直接给终端返回一个个具体的UUID。
当然,以上过程可以扩展,也可以优化:
1、 因为在垂直方向,是可以增加更多的层级的。
2、 越往上的机构,一次申请的UUID数量应该越大(而且应该足够大),这样能够有效减少分配的次数。
以上整个过程是一个分治过程,从上往下一步步进行垂直扩展。事实上,全世界公网IP地址的分配,就是类似的原理。