2.2.3 分布式时间戳方式
本方式提供一个基于Zookeeper(也可以本地配置)的分布式ID生成器,可以生成全局唯一的63位二进制ID。
PS:63位的原因是Java没有无符号整数类型,所以最高位恒为0,保证全局序列是个正数
2.2.3.1 位模式
序列值是63bits的整数。整数的位模式如下:
a.9bits | b.9bits | c.6bits | d.39bits |
其中:
a - e为从高位到低位。
a为线程id的低9位值。
b为9位实例 id值(根据配置, 此值为bootstrap.cnf的instanceId值或者从zookeeper服务器获取的值, 参见1.7.3 分布式time序列)。
c为6位自增长值
d为系统当前时间戳的低39位值(可以使用17年)。
2.2.3.2 退化的分布式时间序列
如果cluster.cnf中的sequenceInstanceByZk值不为true, 序列的维护仅依赖于单实例(bootstrap.cnf的instanceId值的维护),此时序列类似于时间戳方式(参见2.2.2 时间戳方式)。
2.2.3.3 分布式时间序列
如果cluster.cnf中的sequenceInstanceByZk值为true,序列的维护用zookeeper的临时自增节点来维持。每次生成全局序列时,向zk申请一个临时自增节点,通过计算自增节点数 % 32 获取INSTANCEID.