我正在使用InterProcessSemaphoreMutex来实现分布式锁定方法。
锁的典型路径可能是
/锁定/日历/uuid
其中uuid当然是uuid,因此可以生成许多锁定路径。
我认为这些路径最终需要清理,所以我尝试在解锁后使用childdreaper和reaper来清理。
ChildReaper可以工作。如果我添加/lock/calendar/uuid,它会很高兴地删除子节点。日志显示它删除了租约和锁,节点本身在zkClient中显示消失了。然而,突然它开始以一个看似无休止的循环抱怨路径消失了。尽管尝试了Mode.Delete和Mode.Until Gone,但仍如此。
Reaper不执行任何操作,可能是因为/lock/calendar/uuid具有子项。
我是否遗漏了什么?我是否不需要清除这些锁?我需要在并发方面考虑什么?
4条答案
按热度按时间8ljdwjyq1#
InterProcessSemaphoreMutex会创建额外的子节点,如租约、锁等。我针对这种特定类型的锁的解决方法是在获取锁时向Reaper添加额外的路径
/lock/path/leases
、/lock/path/locks
等。zsbz8rwp2#
如果你使用最新的ZooKeeper 3.5.x和最新的Curator,Curator会使用“容器”节点来存放所有的配方,这些节点会根据需要自动清理。Curator的Reaper已被弃用。
iezvtpos3#
收割机的操作步骤如下。
1.创建收割者(指定阈值时间。默认为5分钟)
1.启动收割机
1.添加路径
Thread.wait(//time more than the threshold)
1.闭合式收割机
如果您现在勾选zookeeper,节点将会被删除。
注意:这只适用于路径为空的叶节点。
儿童收割机对我不起作用。如果你能在评论或问题中提出你用过的儿童收割机的步骤,这将是有帮助的。
mwecs4sa4#
Reaper不适用于InterprocessSemaphoreMutex,因为它会有子进程(锁、收据IIRC)。ChildReaper部分工作,但随后开始抱怨失去父进程。这是一个已知的错误,目前已在2.7.1后修复(尚未发布)。一个解决方案是使用ChildReaper和InterprocessLock,如果重入是可接受的。