【弄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~

发布了178 篇原创文章 · 获赞 48 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/yy756127197/article/details/105357215
今日推荐