zookeeper只使用create()实现锁?

3wabscal  于 11个月前  发布在  Apache
关注(0)|答案(1)|浏览(57)

我可以使用zookeeper和create()来实现锁吗?
例如。

acquire() {
  while(1) {
    zk.create(lockPath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    if (lockPath already exists) {
      Stat stat = zk.exists(lockPath, this);
      if (stat != null) {
        this.wait();
      }
    } else {
      return true;
    }
  }
}

release() {
  zk.delete(lockPath, -1)
}

字符串
对不对?
如果是,那么使用序列和短暂子节点的官方实现有什么优势呢?

cyvaqqii

cyvaqqii1#

什么会触发this.wait()发布?除此之外,所提供的解决方案具有几个缺点:

  • 锁不公平:如果多个客户端等待获取,则随机的一个客户端将捕获锁
  • 引入了额外的滞后:不使用节点删除通知
  • 如果应用程序失败,锁将失效

在Zookeeper的网站上有一个食谱:
希望获得锁的客户端执行以下操作:
1.使用路径名“locknode/lock-”调用create(),并设置序列和临时标志。
1.在锁节点上调用getChildren(),而不设置监视标志(这对于避免羊群效应很重要)。
1.如果在步骤1中创建的路径名具有最低的序列号后缀,则客户端具有锁并且客户端退出协议。
1.客户端调用exists(),并在锁目录中具有下一个最低序列号的路径上设置监视标志。
1.如果exists()返回false,则转到步骤2。否则,在转到步骤2之前,等待上一步骤中的路径名通知。
解锁协议非常简单:希望释放锁的客户端简单地删除它们在步骤1中创建的节点。
另外,我强烈推荐Apache Curator--一个在Zookeeper之上广泛使用的库,它实现了很多方法,包括不同种类的锁

相关问题