针对issue中#84 workid是否支持回收 ?的问题 增加一种workId循环复用的模式
美团的同学,你们好! 很感谢你们开源了Leaf框架,为分布式唯一ID生成提供了一种稳定可靠的解决方案,通过阅读源码,我也学到了很多。在看issue中#84 workid是否支持回收这个问题时,我也在仔细思考,由于业务的不同,还是有一些项目存在对workId复用的需求的,所以我fork了项目,然后在不影响之前的每个IP+Port对应一个固定的workId的机制下,增加了一种对workId循环复用的机制。主要实现原理如下:
默认情况时或者是WorkIdMode为PERSISTENT时, workId还是跟之前的一样,每个IP+Port对应一个固定的workId,SnowflakeIDGenImpl使用的holder是SnowflakeZookeeperHolder的实例
IDGen idGen = new SnowflakeIDGenImpl(properties.getProperty("leaf.zk.list"), 8080);
IDGen idGen = new SnowflakeIDGenImpl(properties.getProperty("leaf.zk.list"), 8080, WorkIdMode.PERSISTENT);
如果WorkIdMode为RECYCLABLE时, 此时的workId是可循环利用的,那么SnowflakeIDGenImpl使用的holder是RecyclableZookeeperHolder的实例,工作流程如下:
1.首先会在未使用的workId池(zookeeper路径为/snowflake/leaf.name/recycle/notuse/)中生成所有workId。 2.然后每次服务器启动时都是去未使用的workId池取一个新的workId,然后放到正在使用的workId池(zookeeper路径为/snowflake/leaf.name/recycle/inuse/)下,将此workId用于Id生成,并且定时上报时间戳,更新zookeeper中的节点信息。 3.并且定时检测正在使用的workId池,发现某个workId超过最大时间没有更新时间戳的workId,会把它从正在使用的workId池移出,然后放到未使用的workId池中,以供workId循环使用。 4.并且正在使用这个很长时间没有更新时间戳的workId的服务器,在发现自己超过最大时间,还没有上报时间戳成功后,会停止id生成服务,以防workId被其他服务器循环使用,导致id重复。
IDGen idGen = new SnowflakeIDGenImpl(properties.getProperty("leaf.zk.list"), 8080, WorkIdMode.RECYCLABLE);
我已经对代码测试过了,没有问题,辛苦你们抽出时间看一看代码,希望可以接收这个PR,谢谢了!
发现一个逻辑问题,SnowflakeService 中在获取端口的时候是否能放在leaf.snowflake.enable这个参数的判断后面。
发现一个逻辑问题,SnowflakeService 中在获取端口的时候是否能放在leaf.snowflake.enable这个参数的判断后面。
理论上是放到leaf.snowflake.enable这个参数的判断后面更好一点,因为原来的代码是按照放到前面这种方式写的,所以当时就是根据原来的代码改的,在原来的逻辑增加了后面几种模式
请问下是否考虑过使用redis 来代替zk呢
在 2020-06-14 10:52:40,"NotFound9" [email protected] 写道:
发现一个逻辑问题,SnowflakeService 中在获取端口的时候是否能放在leaf.snowflake.enable这个参数的判断后面。
理论上是放到leaf.snowflake.enable这个参数的判断后面更好一点,因为原来的代码是按照放到前面这种方式写的,所以当时就是根据原来的代码改的,在原来的逻辑增加了后面几种模式
— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.
请问下是否考虑过使用redis 来代替zk呢 在 2020-06-14 10:52:40,"NotFound9" [email protected] 写道: 发现一个逻辑问题,SnowflakeService 中在获取端口的时候是否能放在leaf.snowflake.enable这个参数的判断后面。 理论上是放到leaf.snowflake.enable这个参数的判断后面更好一点,因为原来的代码是按照放到前面这种方式写的,所以当时就是根据原来的代码改的,在原来的逻辑增加了后面几种模式 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.
你可以看看我fork的这个项目有使用MySQL替代Zookeeper作为注册中心,https://github.com/NotFound9/Leaf