在阅读ZooKeeper的锁定配方时,我感到困惑.似乎这个分布式锁定的配方无法保证"任何两个客户端认为它们持有相同锁定的任何快照".但是由于ZooKeeper被如此广泛采用,如果参考文档中存在这样的错误,有人应该在很久以前就指出它,那么我误解了什么呢?
引用分布式锁的配方:
锁
完全分布式锁,全局同步,意味着在任何快照时,没有两个客户端认为它们拥有相同的锁.这些可以使用ZooKeeeper实现.与优先级队列一样,首先定义一个锁定节点.
- 使用路径名" locknode/guid-lock-" 调用create(),并设置序列和短暂标志.
- 在锁定节点上调用getChildren()而不设置监视标志(这对于避免群体效应很重要).
- 如果在步骤1中创建的路径名具有最低序列号后缀,则客户端具有锁,并且客户端退出协议.
- 客户端调用exists(),并在lock目录中的路径上设置watch标志,并使用下一个最低序列号.
- 如果exists()返回false,则转到步骤2.否则,在转到步骤2之前,等待上一步中路径名的通知.
考虑以下情况:
但是,ZooKeeper可能会认为Client1的会话超时了
这是一个有效的场景吗?