ZooKeeper 实现分布式队列
分布式队列是通用的数据结构,为了在 Zookeeper 中实现分布式队列,首先需要指定一个
Znode 节点作为队列节点(queue node), 各个分布式客户端通过调用 create() 函数向队
列中放入数据,调用 create()时节点路径名带"qn-"结尾,并设置顺序(sequence)节点标
志 。 由 于 设 置 了 节 点 的 顺 序 标 志 , 新 的 路 径 名 具 有 以 下 字 符 串 模 式 :
"_path-to-queue-node_/qn-X",X 是唯一自增号。需要从队列中获取数据/移除数据的客户
端首先调用 getChildren() 函数,有数据则获取(获取数据后可以删除也可以不删),
没有则在队列节点(queue node)上将 watch 设置为 true,等待触发并处理最小序号的
节点(即从序号最小的节点中取数据)。
实现步骤基本如下:
前提:需要一个队列 root 节点 dir
入 队 : 使 用 create() 创 建 节 点 , 将 共 享 数 据 data 放 在 该 节 点 上 , 节 点 类 型 为
PERSISTENT_SEQUENTIAL,永久顺序性的(也可以设置为临时的,看需求)。
出队:因为队列可能为空,2 种方式处理:一种如果为空则 wait 等待,一种返回异常。
等待方式:这里使用了 CountDownLatch 的等待和 Watcher 的通知机制,使用了 TreeMap 的
排序获取节点顺序最小的数据(FIFO)。
抛出异常:getChildren()获取队列数据时,如果 size==0 则抛出异常。
评论0