在复杂的分布式系统中全局ID生成器,通常需要满足如下需求:
1》全局唯一
2》趋势递增
3》单调递增
4》信息安全
5》含时间戳
同时需要满足高可用、低延迟、高QPS(一次生成几万个ID)
UUID
UUID.randomUUID().toString()
一、snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。
github.com/twitter-arc… 一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来表示机器、时间等。
其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号,最后还有一个符号位,永远是0。
比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示:
优点:
整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。 可以根据自身业务特性分配bit位,非常灵活。 缺点:
强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。 针对此,美团做出了改进:github.com/Meituan-Dia…
- 具体实现
二、 百度UidGenerator算法
三、叶子Leat 美团 (There are no two identical leaves in the world.)Distributed ID Generate Service
GitHub - Meituan-Dianping/Leaf: Distributed ID Generate Service
四、分布式高效ID
生成 0-99 循环 序列
public static void main(String[] args) {
index = 0;
System.out.println(index);
System.out.println(index % 100);
System.out.println(String.valueOf((index % 100) + 100));
System.out.println(String.valueOf((index % 100) + 100).substring(1, 3));
index = 99;
System.out.println(index);
System.out.println(index % 100);
System.out.println(String.valueOf((index % 100) + 100));
System.out.println(String.valueOf((index % 100) + 100).substring(1, 3));
index = 100;
System.out.println(index);
System.out.println(index % 100);
System.out.println(String.valueOf((index % 100) + 100));
System.out.println(String.valueOf((index % 100) + 100).substring(1, 3));
}
0
0
100
00
99
99
199
99
100
0
100
00