加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

程序员快速提升:精通Zookeeper的经典应用场景

发布时间:2019-08-30 19:41:53 所属栏目:建站 来源:JAVA架构师之路
导读:副标题#e# 内容一:(补充)zookeeper集群的工作原理 zookeeper提供了重要的分布式协调服务,它是如何保证集群数据的一致性的? ① ZAB协议的简单描述 ZAB(zookeeper atomic broadcast)---zookeeper 原子消息广播协议是专门为zookeeper设计的数据一致性协议,

顺序节点的应用,类似于我们在用zookeeper实现分布式锁的时候如何去处理惊群效应的做法。 且根据队列的特点:FIFO(先进先出),入队时我们创建顺序节点(ps:为什么上面我们是用了顺序节点而不是说是临时顺序节点,是因为我们根本不考虑客户端挂掉的情况)并把元素传入队列,出队时我们取出最小的节点。使用watch机制来监听队列的状态,在队列满时进行阻塞,在队列空时进行写入即可。

入队操作

程序员快速提升:精通Zookeeper的经典应用场景

如上图,我们生产者需要对资源进行访问时,会申请获取一个分布式锁,如果未成功抢占锁,就会进行阻塞,抢到锁的生产者会尝试把任务提交到消息队列,此时又会进行判断,如果队列满了,就监听队列中的消费事件,当有消费队列存在空位时进行入队,未消费时阻塞。入队时它会进行释放锁的操作,唤醒之前抢占锁的请求,并让之后的生产者来获取。

出队操作

出队和入队的机制是十分相似的。

程序员快速提升:精通Zookeeper的经典应用场景

② JDK阻塞队列操作

阻塞队列:BlockingQueue---线程安全的阻塞队列

它以4种形式出现,对于不能立即满足但是在将来某一时刻可能满足的操作,4种形式的处理方式皆不同

1.抛出一个异常2.返回一个特殊值,true or false3.在操作可以成功前,无限阻塞当前线程4.放弃前只在给定的最大时间限制内阻塞复制代码

程序员快速提升:精通Zookeeper的经典应用场景

我们将会实现这个阻塞队列接口来实现我们的分布式队列

内容三:分布式队列的代码实现

public class ZkDistributeQueue extends AbstractQueue implements BlockingQueue , java.io.Serializable

继承了AbstractQueue,可以省略部分基础实现

① 基本的配置信息及使用到的参数

程序员快速提升:精通Zookeeper的经典应用场景

首先我们需要一个zkClient的客户端,然后queueRootNode是分布式队列的存放元素的位置,指定了一个默认的根目录default_queueRootNode,把队列中的元素存放于/distributeQueue下,写锁节点代表往队列中存放元素,读锁节点代表从队列中去取元素,这个设计简单点来说就是,queueRootNode作为最大的目录,其下有3个子目录,分别是queueWriteLockNode,queueReadLockNode和queueElementNode,其他的就是一些需要使用到的配置信息

② 构造器

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读