【弄nèng - Zookeeper】Zookeeper入门教程(七)—— 分布式Barrier

本文介绍zk客户端curator的使用,本文主要介绍Curator recipes的使用
官方文档传送门
官方文档Curator recipes
参考:http://www.throwable.club/2018/12/16/zookeeper-curator-usage/
参考书籍:《从Paxos到ZooKeeper 分布式一致性原理与实践》

1. 分布式Barrier

JDK有CyclicBarrier来控制多线程之间同步,达到等待一定数量线程就绪后一起执行的效果。但是对于分布式系统来说不使用。ZK提供的DistributedDoubleBarrier解决了这个问题。

pom

		<dependency>
			<groupId>org.apache.curator</groupId>
			<artifactId>curator-recipes</artifactId>
			<version>2.13.0</version>
		</dependency>

2. 第一种使用方式

该事例模拟了5个线程,通过setBarrier完成barrier设置,通过waitOnBarrier等待barrier释放,然后在主线程中通过removeBarrier释放barrier,同时出发5个线程的业务逻辑处理。

关键方法

// 完成barrier设置
barrier.setBarrier();
// 等待barrier释放
barrier.waitOnBarrier();
// 释放barrier
barrier.removeBarrier();                        

事例

	@Test
    public void BarrierTest() throws Exception {
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                public void run() {
                    try {
                        CuratorFramework client = getZkClient();
                        barrier = new DistributedBarrier(client, barrier_path);
                        System.out.println(Thread.currentThread().getName() + "barrier设置");
                        // 完成barrier设置
                        barrier.setBarrier();
                        // 等待barrier释放
                        barrier.waitOnBarrier();
                        System.err.println("启动");
                    } catch (Exception e) {
                    }
                }
            }).start();
        }
        Thread.sleep(2000);
        // 释放barrier
        barrier.removeBarrier();
    }

    private CuratorFramework getZkClient() {
        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000);
        CuratorFramework zkClient = CuratorFrameworkFactory.builder()
                .connectString("localhost:2181")
                .sessionTimeoutMs(5000)  // 会话超时时间,默认60000ms
                .connectionTimeoutMs(10000) // 连接超时时间,默认15000ms
                .retryPolicy(retryPolicy) // 重试策略
                .build();
        zkClient.start();
        return zkClient;
    }

控制台
在这里插入图片描述

3. 第二种使用方式

DistributedDoubleBarrier barrier = new DistributedDoubleBarrier(client, barrier_path, 5);设置了数目5,调用enter进入准备进入状态,等待退出barrier成员达到5个,调用leave进入准备退出状态,等待退出barrier成员达到5个。

关键方法

// 进入准备进入状态,等待退出barrier成员达到指定数目
barrier.enter();
// 进入准备退出状态,等待退出barrier成员达到指定数目
barrier.leave();

事例

@Test
    public void BarrierTest1() throws Exception {
        for (int i = 0; i < 5; i++) {
            new Thread(new Runnable() {
                public void run() {
                    try {
                        CuratorFramework client = getZkClient();
                        DistributedDoubleBarrier barrier = new DistributedDoubleBarrier(client, barrier_path, 5);
                        Thread.sleep(Math.round(Math.random() * 3000));
                        System.out.println(Thread.currentThread().getName() + "进入barrier");
                        // 进入准备状态,等待进去barrier成员达到5个
                        barrier.enter();
                        System.out.println("启动");
                        Thread.sleep(Math.round(Math.random() * 3000));
                        // 进入准备退出状态,等待退出barrier成员达到5个
                        barrier.leave();
                        System.out.println("退出");
                    } catch (Exception e) {
                    }
                }
            }).start();
        }
        Thread.sleep(10000);
    }

    private CuratorFramework getZkClient() {
        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000);
        CuratorFramework zkClient = CuratorFrameworkFactory.builder()
                .connectString("localhost:2181")
                .sessionTimeoutMs(5000)  // 会话超时时间,默认60000ms
                .connectionTimeoutMs(10000) // 连接超时时间,默认15000ms
                .retryPolicy(retryPolicy) // 重试策略
                .build();
        zkClient.start();
        return zkClient;
    }

控制台
在这里插入图片描述

源码地址

IT-CLOUD-ZOOKEEPER :zookeeper客户端Curator事例


项目推荐

IT-CLOUD :IT服务管理平台,集成基础服务,中间件服务,监控告警服务等。
IT-CLOUD-ACTIVITI6 :Activiti教程源码。博文在本CSDN Activiti系列中。
IT-CLOUD-ELASTICSEARCH :elasticsearch教程源码。博文在本CSDN elasticsearch系列中。
IT-CLOUD-KAFKA :spring整合kafka教程源码。博文在本CSDN kafka系列中。
IT-CLOUD-KAFKA-CLIENT :kafka client教程源码。博文在本CSDN kafka系列中。
IT-CLOUD-ZOOKEEPER :zookeeper客户端Curator事例。博文在本CSDN zookeeper系列中。

开源项目,持续更新中,喜欢请 Star~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值