以示例形式说明 zk 食谱。

假定有 4 个客户端,分别执行 create -s -e /lock/read xx 或 create -s -e /lock/write 获取锁。

一、获取读锁的情况:
/lock/write001
/lock/write002
/lock/read003
/lock/read004

客户端 3 获取读锁:
1. 创建 /lock/read003
2. 获取 /lock 的孩子
3. 发现 writexxx 的最小序号 1 比 3 小
4. 发现 /lock/write002 存在
5. watch /lock/write002 节点,获得通知后,再进入步骤 2

/lock/write001
/lock/read002
/lock/read003
/lock/read004

客户端 2 获取读锁:
1. 创建 /lock/read002
2. 获取 /lock 的孩子
3. 发现 writexxx 的最小序号 1 比 2 小
4. 发现 /lock/write002 不存在
5. 进入步骤 2

/lock/read001
/lock/write002
/lock/read003
/lock/read004

客户端 1 获取读锁:
1. 创建 /lock/read001
2. 获取 /lock 的孩子
3. 发现 writexxx 的最小序号 2 比 1 大,则获得锁

二、获取写锁的情况:
/lock/write001
/lock/read002
/lock/read003
/lock/read004

客户端 1 获得写锁:
1. 创建 /lock/write001 节点
2. 获得 /lock 孩子
3. 发现最小的序号是 001,就是自己,则获得锁

/lock/write001
/lock/read002
/lock/write003
/lock/read004

客户端 3 获得写锁:
1. 创建 /lock/write003 节点
2. 获得 /lock 孩子
3. 发现 001 是最小的序号
4. 发现 xx002 存在
5. watch xx002,等待通知进入步骤 2

/lock/write001
/lock/write002
/lock/read003
/lock/read004

客户端 2 获得写锁:
1. 创建 /lock/write002 节点
2. 获得 /lock 孩子
3. 发现最小的序号是 001
4. 发现 xx002 不存在,因为自己就是
5. 进入步骤 2

三、leader 选举
创建顺序、瞬时节点:create -s -e /election/n- xx

假定 4 个客户端,分别创建如下节点:
/election/n-001
/election/n-002
/election/n-003
/election/n-004

则:
/election/n-001 是 leader

为了避免出现羊群效应,不让所有的客户端 watch 同一个节点。
/election/n-002 watch /election/n-001
/election/n-003 watch /election/n-002
/election/n-004 watch /election/n-003

zookeeper 食谱的更多相关文章

  1. ZooKeeper食谱(八)

    使用ZooKeeper构造高级别应用的指南 在这个文章中,你将会发现使用ZooKeeper来实现高级别功能的指南.所有的它们在客户端上被实现而不需要ZooKeeper特别的支持.希望社区将注意到这些约 ...

  2. ZooKeeper之service discovery

    Zookeeper整体介绍 ZooKeeper is a centralized service for maintaining configuration information, naming, ...

  3. ZooKeeper文档(二)

    ZooKeeper:因为协调的分布式系统是一个动物园 ZooKeeper对分布式应用来说是一个高性能的协调服务.它暴露通常的服务-比如命名,配置管理,同步,和组服务-用一种简单的接口,所以你不用从头开 ...

  4. Zookeeper客户端Curator使用详解

    Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...

  5. ZooKeeper动态配置(十四)

    概述 在3.5.0发行之前,ZK的全体成员和所有其它的配置参数是静态加载的在启动的时候并且在运行的时候不可变.操作员诉诸于"滚动重启" - 一个手动密集和改变配置文件容易出错的方法 ...

  6. zookeeper(六):Zookeeper客户端Curator的API使用详解

    简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsEx ...

  7. 转:Zookeeper客户端Curator使用详解

    原文:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBo ...

  8. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  9. [译]ZOOKEEPER RECIPES-Leader Election

    选主 使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志.主要思想是,使用一个znode,比如"/election",每个客 ...

随机推荐

  1. K-近邻

    概述 KNN算法本身简单有效,是一种lazy-learning算法: 分类器不需要使用训练集进行训练,训练时间复杂度为0: KNN分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档 ...

  2. 【Python】【面向对象】

    """# [[面向对象]]#[访问限制]#如果要让内部属性不被外部访问,可加双下划线,编程私有变量.只有内部可以访问,外部不能访问.class Student(objec ...

  3. hdu 6170 Two strings dp

    Two strings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Prob ...

  4. ERP系统知识笔记

    中心思想: 1.不管哪一家的ERP系统,都是以“平衡供需”为目的.以计划为中心思想的,并将各管理职能作紧密的集成 2.手工管理方式下,对库存量的掌握是不完整的.手工方式下,我们的数据只有现存量,无法记 ...

  5. ajax 怎么重新加载页面

    $.ajax({ type:"post", url:url, data:{xxx:xx}, dataType: "json", success : functi ...

  6. AQS是什么?

    AQS介绍 AQS,即AbstractQueuedSynchronizer, 队列同步器,它是Java并发用来构建锁和其他同步组件的基础框架.来看下同步组件对AQS的使用: AQS是一个抽象类,主是是 ...

  7. Java——Collections

    反转数组 Collections.reserve(ArrayList) 例子如下 /** * public class ListNode { * int val; * ListNode next = ...

  8. 一些angular/js/ts的坑和吐槽

    ------20190318 ------------- 回头看,很多槽点已经随着升级改掉了   绑定string字面值到子组件@Input <app-overlay-static [name] ...

  9. feed

    a1=tf.placeholder(tf.float32)    # 占位符 a2=tf.placeholder(tf.float32)r=tf.multiply(a1,a2) with tf.Ses ...

  10. MySQL学习(二)

    1 增删改查是针对表来说的. 2 创建一个表 mysql> create table stu( -> id int primary key auto_increment, -> sn ...