博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译]ZOOKEEPER RECIPES-Barriers
阅读量:6343 次
发布时间:2019-06-22

本文共 1749 字,大约阅读时间需要 5 分钟。

Barrier

在分布式系统中常使用Barrier来阻塞进程,当满足一定条件后再恢复进行后续操作。Barrier在Zookeeper中可以通过设计一个Barrier节点来实现。Barrier 节点存在时会进行阻塞,下面是伪代码:

1.客户端调用exists方法来检查Barrier节点是否存在,并设置watch为true。
2.如exists返回false,表示Barrier条件满足,继续运行。
3.如exists返回true,客户端等待Zookeeper的节点上的watch事件。
4.当watch触发后,返回第一步继续进行检查exist直到节点被删除。

双重Barrier(Double Barrier)

双重Barrier让客户端同步地开始和结束进程。当进程数满足Barrier需求,就开始运行,并在运行完后释放Barrier,下面介绍如何使用Zookeeper的节点创建一个双重Barrier。

在本例的伪代码中创建一个节点b作为Barrier。每个客户端p注册在Barrier节点上并在离开时注销。一个节点通过下面的注册流程进行注册,直到x个客户端注册后再继续运行。(x可以由你自己系统决定)

注册 注销
1.定义n = b+"/"+p 2.设置watch进行判断是否存在:exists(b + "/ready", true) 3.创建子节点create( n, EPHEMERAL) 4.获得存在的子节点L = getChildren(b, false) 5.如果L的个数比x小则等待watch事件 6.否则创建create(b + "/ready", REGULAR) 1.获得存在的子节点数L = getChildren(b, false) 2.如果没有子节点则退出 3.如果p是唯一子节点,则删除n并退出 4.如果p是L中最小的子节点,等最大的节点注销 5.否则delete(n),并等待最小的节点删除 6.返回第1步

在注册时,所有进程监视ready节点并在Barrier节点下创建一个ephemeral节点。除了最后注册的节点,每个进程在第5步等待ready节点创立,最后一个进程会看到所有x个子节点并创建ready节点,从而唤醒其他进程。

在注销时,由于需要监视的是节点的删除,就无法使用ready标志了。注册时,使用ephemeral节点,就算进程在触发Barrier之后报错也不会影响其他正常的进程。当进程准备退出,他们需要删除自己的进程节点并等待其他进程全部删除。
b下没有进程子节点时,进程退出。然而,为了提高效率,你可以使用最小的进程节点作为ready标志。所有其他进程准备删除时,watch最小的进程节点删除,而最小的进程本身,监视其他任何一个节点(为了方便可以取最大的那个节点)。这意味着,每个节点删除最多只会唤醒一个进程,只有最后一个节点在删除时会唤醒所有进程。

使用Curator

Barrier

public DistributedBarrier(CuratorFramework client,String barrierPath)/** client         客户端实例    barrierPath    barrier节点的路径**/public void waitOnBarrier()    阻塞进程public void setBarrier()       设置Barrierpublic void removeBarrier()    移除Barrier

双重Barrier

public DistributedDoubleBarrier(CuratorFramework client,String barrierPath,int memberQty)/** client        客户端实例    barrierPath   barrier节点的路径    memberQty     期望节点的数量**/public void enter()    注册public void leave()    注销

转载于:https://www.cnblogs.com/resentment/p/6194361.html

你可能感兴趣的文章
memcached的安装与开启脚本
查看>>
Linux与Window字符集~~伤不起的幽灵空白符
查看>>
zabbix 邮件报警 -- sendmail
查看>>
JavaScript异步编程
查看>>
tcpdump用法小记
查看>>
MySQL基础安全注意细节
查看>>
Oracle随机函数—dbms_random
查看>>
pvr 批量转换
查看>>
linux命令basename使用方法
查看>>
windows下开发库路径解决方案
查看>>
linux迁移mysql数据目录
查看>>
脚本源码安装LNMP
查看>>
Percona Server安装
查看>>
函数为左边表达式
查看>>
读书杂谈一
查看>>
winform listbox 元素显示tooltrip
查看>>
cacti安装与配置
查看>>
TF-IDF与余弦相似性的应用(一):自动提取关键词
查看>>
javascript面向对象2
查看>>
限制容器对CPU的使用 - 每天5分钟玩转 Docker 容器技术(28)
查看>>