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