在分布式系统中,如何在各个不同的服务器上产生数据主键ID值?
比如,有一个订单系统被部署在了AB两个节点上(即两台服务器上),那么如何在这两个节点上各自生成订单ID,并且保证ID值不会冲突?
![e3926b430914da769eb14f79189f70b7.png](https://img-blog.csdnimg.cn/img_convert/e3926b430914da769eb14f79189f70b7.png)
通常有以下3种方法:
1、使用数据库的自增特性(或Oracle中的序列) , 不同节点直接使用相同数据库的自增ID值。
2、使用UUID算法产生ID值。
3、使用SnowFlake算法产生ID值。
由于Java提供了对UUID的支持, 可以直接通过UUID.random UUID) 获取到UUID值。
本文重点介绍SnowFlake算法。SnowFlake算法被称为雪花算法, 是由Twitter提出的一种生成ID的算法, 该算法会生成一个64bit的整数,共可以表示263个ID值。
SnowFlake算法采用“41位时间戳+10位机器码+12位序列号”的大致思想是, 当多个节需要生成多个ID值时,先判断这些节点是否是在同一时刻(精确到ms)生成的ID。
如果不是位序列号”区分ID值。可以直接根据41位时间截区分出ID值;如果是在同一时刻生成的,就再根据“10位机器码和12位序列号“来区分ID值。