相关文章:
二、使用ZooKeeper实现Java跨JVM的分布式锁(优化构思)
三、使用ZooKeeper实现Java跨JVM的分布式锁(读写锁)
屏障(Barriers):
分布式系统使用屏障(barriers)来阻塞某一节点集的任务,直到满足特定的条件该节点集的所有节点才能正常向前推进,就像屏障一样,在当条件不满足时,屏障阻塞了任务的执行,只有当条件满足后屏障才会被拆除,各节点才能推进自己正在执行的任务。Zookeeper 中实现屏障时指定一个屏障节点(barrier node),如果屏障节点存在,屏障就会生效,下面是伪代码:1、户端在屏障节点上调用 ZooKeeper API exists(),watch 设置为 true.
2、如果 exists() 返回 false,屏障消失,客户端可以推进的自己的工作。
3、否则, exists() 返回 true,客户端等待屏障节点上监听事件的到来。
4、如果监听事件被触发,客户端重新执行 exists( ), 再一次重复上述 1-3 步,直到屏障节点被移除。
示例代码:
package com.framework.code.demo.zook.barrier;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.barriers.DistributedBarrier;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class BarrierDemo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework client = CuratorFrameworkFactory
.newClient("192.168.142.128:2181", retryPolicy);
client.start();
//创建屏障类 不同JVM需要使用相同的目录 即/DistributedBarrier
final DistributedBarrier barrier = new DistributedBarrier(client, "/DistributedBarrier");
//创建屏障节点
barrier.setBarrier();
//启动一个线程,5000毫秒后移除屏障
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
barrier.removeBarrier();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
//等待屏障移除
barrier.waitOnBarrier();
System.out.println("======屏障已经移除======");
Thread.sleep(30000);
client.close();
}
}