ZooKeeper分布式锁简单实践

前几周写了篇 利用Redis实现分布式锁 ,今天简单总结下ZooKeeper实现分布式锁的过程。其实生产上我只用过Redis或者数据库的方式,之前还真没了解过ZooKeeper怎么实现分布式锁。这周简单写了个小Demo,更坚定了我继续使用Redis的信心了。

ZooKeeper分布式锁的实现原理

ZooKeeper分布式锁简单实践

在分布式解决方案中,Zookeeper是一个分布式协调工具。当多个JVM客户端,同时在ZooKeeper上创建相同的一个临时节点,因为临时节点路径是保证唯一,只要谁能够创建节点成功,谁就能够获取到锁。没有创建成功节点,就会进行等待,当释放锁的时候,采用事件通知给客户端重新获取锁资源。如果请求超时直接返回给客户端超时,重新请求即可。

代码实现

为了更好的展现效果,我这里设置每个线程请求需要1s,请求超时时间为30s。

 首先我们先写一个测试类,模拟多线程多客户端请求的情况:

public class ZkLockTest implements Runnable { private ZkLock zkLock = new ZkDistributedLock(); public void run() { try { if (zkLock.getLock((long)30000,null)) { System.out.println("线程:" + Thread.currentThread().getName() + ",抢购成功:" + System.currentTimeMillis()); } else { System.out.println("线程:" + Thread.currentThread().getName() + ",抢购超时失败请重试:" + System.currentTimeMillis()); } Thread.sleep(1000); } catch (Exception e) { } finally { zkLock.unLock(); } } public static void main(String[] args) { System.out.println("zk分布式锁开始。。"); for (int i = 0; i < 100; i++) { new Thread(new ZkLockTest()).start(); } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzgdzp.html