6

我将 InterProcessSemaphoreMutex 用于分布式锁定配方。

锁的典型路径可能是

/锁/日历/uuid

其中 uuid 当然是 uuid,因此可能会生成许多锁定路径。

我认为这些路径最终需要清理,所以我在解锁锁后尝试使用 childreaper 和 reaper 来清理。

ChildReaper 之类的作品。如果我添加 /lock/calendar/uuid 它会愉快地删除孩子。日志显示它删除了租约和锁,并且节点本身显示在 zkClient 中消失了但是突然它开始在看似无休止的循环中抱怨路径消失了。尽管尝试了 Mode.Delete 和 Mode.Until Gone。

Reaper 什么都不做,可能是因为 /lock/calendar/uuid 有孩子。

我错过了什么吗?我不需要清理这些锁吗?我需要明智地担心并发性。

4

4 回答 4

3

如果您使用最新的 ZooKeeper 3.5.x 和最新的 Curator,Curator 会为其所有配方使用“容器”节点,并且这些节点会根据需要自动清理。Curator's Reaper 已被弃用。

于 2017-09-24T21:03:58.753 回答
3

InterProcessSemaphoreMutex 创建额外的子节点,例如租约、锁等。我对这种特定类型的锁的解决方法是在获取锁时向 Reaper 添加额外的路径/lock/path/leases/lock/path/locks等。

于 2017-09-23T13:19:03.327 回答
0

Reaper 不会为 InterprocessSemaphoreMutex 工作,因为它会有孩子(锁,收据 IIRC)。ChildReaper 确实部分工作,但随后开始抱怨失去父母。这是目前在 2.7.1 后修复的已知错误(尚未发布)。如果重入是可以接受的,一种解决方法是使用 ChildReaper 和 InterprocessLock。

于 2015-04-01T23:57:10.797 回答
0

收割者的步骤必须如下。

  1. 创建收割机(指定阈值时间。默认为 5 分钟)
  2. 开始收割机
  3. 添加路径
  4. Thread.wait(//time more than the threshold)
  5. 关闭收割机

如果现在检查 zookeeper,该节点将被删除。

注意:这仅适用于路径为空时的叶节点。

PS:儿童收割者对我不起作用。如果您可以在评论或问题中提出您用于儿童收割者的步骤,这将有所帮助。

于 2015-04-01T21:31:43.587 回答