ZooKeeper客户端框架Curator实现屏障服务(Barrier)

相关文章:

一、使用ZooKeeper实现Java跨JVM的分布式锁

二、使用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();
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值