• Barriers解决什么问题?

当有些操作需要所有参与者全部准备好之后才能开始执行,并且对每个参与者来说必须等待所有参与者全部执行完毕,才算执行完毕。于是就需要一个屏障,来控制所有参与者同时开始,并等待所有参与者全部结束。

  • 实现barriers需要注意的问题

1.如何控制所有线程同时开始?

  1. 参与者准备好时就在/barrier父节点下插入顺序临时节点。
  2. 调用getChidren方法,并设置watch,检查/barrier下所有children节点的数量是否等于所有参与者的数量。
  3. 如果等于,则说明所有参与者都已到达,本参与者开始执行自己的业务代码。
  4. 如果不是,则此参与者调用wait()方法阻塞。
  5. 当有别的参与者插入新的子节点时这个参与者会收到通知,调用notify唤醒线程,第二步重新开始执行。

2.如何等待所有线程结束?

  1. 参与者执行完毕后,调用delete方法删除自己的子节点
  2. 获取父节点下的子节点数量n,并设置watch
  3. 如果n=0,说明所有参与者都已执行完毕,本参与者是最后一个,则可以直接结束。
  4. 如果n>0,则本参与者调用wait方法阻塞
  5. 如果别的参与者执行完毕,删除了一个子节点,则本参与者会收到通知,调用notify唤醒线程,第二步重新开始执行。

3.用什么类型的节点?

根节点使用持久节点(persistent node),子节点使用临时节点(Ephemeral node)

根节点为什么要用持久节点?首先因为临时节点不能有子节点,所以根节点要用持久节点,并且在程序中要判断根节点是否存在。

子节点为什么要用临时节点?临时节点随着连接的断开而消失,在程序中,虽然会删除临时节点,但可能会出现程序在节点被删除之前就crash了,如果是持久节点,节点不会被删除。

  • 源码
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Random;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;//这个类是barrier的父类,负责初始化zkclient,并且实现了Watcher接口,负责接收zookeeper通知
public class SyncPrimitive implements Watcher {static ZooKeeper zk = null;//zk client对象static Integer mutex; //这是barrier用到的锁String root;//这是barrieer父节点SyncPrimitive(String address) {if(zk == null){try {System.out.println("Starting ZK:");zk = new ZooKeeper(address, 3000, this);mutex = new Integer(-1);System.out.println("Finished starting ZK: " + zk);} catch (IOException e) {System.out.println(e.toString());zk = null;}}//else mutex = new Integer(-1);}//接收zookeeper通知,唤醒barrier中的enter()和leave()方法中的等待线程synchronized public void process(WatchedEvent event) {synchronized (mutex) {//System.out.println("Process: " + event.getType());mutex.notify();}}/*** Barrier*/static public class Barrier extends SyncPrimitive {int size;String name;//本参与者对应的子节点path/*** Barrier constructor,调用父类构造函数,并创建父节点** @param address* @param root* @param size*/Barrier(String address, String root, int size) {super(address);this.root = root;this.size = size;// Create barrier nodeif (zk != null) {try {Stat s = zk.exists(root, false);if (s == null) {zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);}} catch (KeeperException e) {System.out.println("Keeper exception when instantiating queue: "+ e.toString());} catch (InterruptedException e) {System.out.println("Interrupted exception");}}// My node nametry {name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());} catch (UnknownHostException e) {System.out.println(e.toString());}}/*** Join barrier 参与者执行enter进入屏障** @return* @throws KeeperException* @throws InterruptedException*/boolean enter() throws KeeperException, InterruptedException{zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);while (true) {synchronized (mutex) {List<String> list = zk.getChildren(root, true);if (list.size() < size) {mutex.wait();} else {return true;}}}}/*** Wait until all reach barrier 参与者执行leave()离开屏障** @return* @throws KeeperException* @throws InterruptedException*/boolean leave() throws KeeperException, InterruptedException{zk.delete(root + "/" + name, 0);while (true) {synchronized (mutex) {List<String> list = zk.getChildren(root, true);if (list.size() > 0) {mutex.wait();} else {return true;}}}}}

zookeeper读书笔记十 zookeeper实现分布式屏障Barriers相关推荐

  1. 主成分分析碎石图_ISLR读书笔记十九:主成分分析(PCA)

    本文使用 Zhihu On VSCode 创作并发布 前面写的一些统计学习方法都是属于监督学习(supervised learning),这篇主成分分析(principal components an ...

  2. ZooKeeper学习笔记(八):ZooKeeper集群写数据原理

    写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...

  3. 计算机英语读书笔记,大学英文读书笔记范文英语读书笔记十篇带翻译.doc

    大学英文读书笔记范文英语读书笔记十篇带翻译 My Room This is my room. Near the window there is a desk. I often do my homewo ...

  4. 图解HTTP读书笔记(十)

    图解HTTP读书笔记(十) Web的攻击技术 HTTP协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击对象.应用HTTP协议的服务器和客户端,以及运行在服务器上的Web应用资源才是攻击目标. ...

  5. PHP第十次实验总结,The Clean Architecture in PHP 读书笔记(十)

    laravel 这是clean architecture的第十篇,也是具体案例的第二篇,本篇会通过使用laravel框架,来开发我们的应用. 本文为系列文章的第十篇,完成的目录请查看Clean Arc ...

  6. 《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

    当数据具有资产属性之后,数据便可以直接或者间接地为公司.为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易. 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战 ...

  7. 【Zookeeper读书笔记-2】序列化框架Jute

    1 Jute概念 ZK客户端与服务端的网络通信和数据传输,需要首先解决的事数据序列化与反序列化问题. Jute前身是Hadoop Record IO,后来Hadoop框架采用Avro(跨语言特性好,数 ...

  8. ZooKeeper学习笔记五 ZooKeeper开源客户端ZkClient

    本文学习资源来自<从Paxos到ZooKeeper分布式一致性原理与实践> ZkClient ZkClient 在ZooKeeper原生API接口之上进行了封装,是一个更易用的ZooKee ...

  9. 《把时间当作朋友》读书笔记(十四)--积累(二)

    节省与否 有些钱真不能省,否则注定"屌丝"一生,因为这种"节省"可能会伴随有很高的隐性成本,或者将来造成很大的负担----今天看来省了,可将来却要因此付出极大的 ...

最新文章

  1. 摆动排序leetcode324
  2. opencv 图像分割
  3. 计算机算法设计与分析之----- 递归与分治策略
  4. [转]游戏中各种性能优化方法(不断更新)
  5. linux常见命令_Linux系统常见命令
  6. 一个项目中既有移动端,同时也有PC端的代码,并且 他们的代码分开写的,那么如何实现在手机跳转手机页面,pc点击跳转pc页面...
  7. python 实现SOM: 函数更新
  8. 【JAVA源码分析——Java.lang】String源码分析
  9. Linux svn 查看项目的下载地址
  10. Ubuntu 1804 桌面版 Eclipse + JSP 学习记录
  11. cboard centos7安装步骤
  12. 【AI案例实践】基于深度学习的超分辨率技术
  13. matlab检验数据异方差,求教!怀特异方差检验方法在matlab中的实现,以及广义最小平方法...
  14. FoveaBox(Beyond Anchor-based Object Detector) 学习笔记
  15. Comparative Evaluation of Genome Assemblers from Long-Read Sequencing for Plants and Crops
  16. 新研究调查Masimo ORi™(氧储备指数)能否用作避免全麻期间高氧状态的指数
  17. 啥? 代码可以改变世界? 道翰天琼认知智能API接口平台为您揭秘。
  18. 计算机组成原理之外围设备
  19. 鸿蒙系统上市时间p20pro,华为P20/20 Pro今日正式发布:外观配置详细汇总
  20. 无心剑七绝《十里龙舟》

热门文章

  1. 程序员正确打开碎片时间的方法
  2. 漫谈程序猿系列:看看你离优秀有多远
  3. c语言属于结构化程序设计语言,c语言填空题1.结构化程序设计语言的三种基本结构分别是,和.-查字典问答网...
  4. SwiftUI 界面大全之个人简历界面支持自定义字体(教程含源码)
  5. poj 1830 高斯消元
  6. Python基础教程(第3版)读书笔记:第2章 列表和元组
  7. 英文网站针对google优化用阿里云dns好吗?
  8. 机器人瓦力有什么西方的风格_机器人瓦力观后感 英文
  9. iReport学习一:中文字体显示
  10. ....他乡遇故知....