1. 雪花算法,要保持全局唯一,必须要指定唯一的dataCenterId和 workerId,正常这两个数都是0-31 之间的一个值。
  2. 如果我们自己的商用节点,应该依赖注册中心,手动的为每隔节点指定 dataCenterId和workerId
  3. hutool 里面的 雪花算法能用吗?
    hutool里面的没有注册中心,所以不能保证全局唯一的dataCenterId和workId,但是 hutool里面里面的 dataCenterId 是通过物理地址算出来的,然后workId 是通过 dataCenterId+进程Id算出来的.
    结论:同一台物理机上 dataCenterId会相等,不同物理机的 dataCenterId 大概率不会相等,同一个Java进程里面 workId 会相等,Java进程重启 workId 会变化 大概率不会相等
    所以可以简单的看成hutool随机的指定了dataCenterId和workId重复的概率 1/255 分之一,如果你能接受2台机子重复概率是1/255分之一就
  4. 怎么保存dataCenterId和workId在集群节点上唯一?
  • 常用的做法是依赖zk的零时节点。
  • 也可以考虑redisson带有看门狗的分布式锁。(对于不想额外引入zk的程序,并且已经有redis)。
  • 可以读取物理机硬盘内指定文件的内的编号,依赖人工保证生成的dataCenterId和workId是否重复,并且下次启动的时候还是读取这个文件。对于redis都没有的程序推荐这种做法,简单并且一劳用益。
  1. hutool里面的通过物理地址计算dataCenterId的方法是取物理地址的第6个字节+第5个字节的高2位,构成的新数字对31取模得到。也就是dataCenterId 只和 第5字节的高二位 和 第6个字节有关系。