读书人

Zookeeper(7)分布式锁

发布时间: 2013-04-02 12:35:26 作者: rapoo

Zookeeper(七)分布式锁

获取锁实现思路:

1. 首先创建一个作为锁目录(znode),通常用它来描述锁定的实体,称为:/lock_node

2. 希望获得锁的客户端在锁目录下创建znode,作为锁/lock_node的子节点,并且节点类型为有序临时节点(EPHEMERAL_SEQUENTIAL);

例如:有两个客户端创建znode,分别为/lock_node/lock-1和/lock_node/lock-2

3. 当前客户端调用getChildren(/lock_node)得到锁目录所有子节点,不设置watch,接着获取小于自己(步骤2创建)的兄弟节点

4. 步骤3中获取小于自己的节点不存在 && 最小节点与步骤2中创建的相同,说明当前客户端顺序号最小,获得锁,结束。

5. 客户端监视(watch)相对自己次小的有序临时节点状态

6. 如果监视的次小节点状态发生变化,则跳转到步骤3,继续后续操作,直到退出锁竞争。

 public synchronized void unlock() throws RuntimeException {                if (!isClosed() && id != null) {            // we don't need to retry this operation in the case of failure            // as ZK will remove ephemeral files and we don't wanna hang            // this process when closing if we cannot reconnect to ZK            try {                                ZooKeeperOperation zopdel = new ZooKeeperOperation() {                    public boolean execute() throws KeeperException,                        InterruptedException {                    // 删除节点  忽略版本                        zookeeper.delete(id, -1);                           return Boolean.TRUE;                    }                };                zopdel.execute();            } catch (InterruptedException e) {                LOG.warn("Caught: " + e, e);                //set that we have been interrupted.               Thread.currentThread().interrupt();            } catch (KeeperException.NoNodeException e) {                // do nothing            } catch (KeeperException e) {                LOG.warn("Caught: " + e, e);                throw (RuntimeException) new RuntimeException(e.getMessage()).                    initCause(e);            }            finally {                if (callback != null) {                    callback.lockReleased();                }                id = null;            }        }    }

读书人网 >云计算

热点推荐