分布式队列分为两大类。
(1) FIFO先入先出队列模型。
(2)等待队列元素聚集后,统一安排处理执行的Barrier模型。
FIFO先入先出
FIFO队列模型
Zookeeper实现FIFO队列
设计思路
所有的客户端都到 /queue_fifo
这个节点下面创建一个临时顺序节点,例如 /queue_fifo/host1-000001
。
设计步骤
- 通过调用
getChildren()
接口获取/queue_fifo
节点的所有子节点,即获取队列中所有元素。 - 确定自己的节点序号在所有子节点中的顺序。
- 如果自己的序号不是最小,那么就需要等待,同时向比自己序号小的最后一个子节点注册Watcher监听。
-
Barrier:分布式屏障
分布式屏障模型
在分布式系统中,Barrier特指系统之间的一个协调条件,规定了一个队列的元素必须都集齐后才能统一进行安排,否则就会一直等待。这往往出现在那些大规模分布式并行计算的应用场景中,最终的合并计算需要基于很多并行计算的资结果来进行。
Zookeeper实现分布式屏障
设计思路
开始时,
queue_barrier
节点是一个已经存在的默认节点,并且将其节点的数据内容复制为一个数字n来代表Barrier值。例如n=10表示只有当queue_barrier
节点的子节点个数达到10个后,才会打开Barrier。
之后,所有的客户端都会到queue_barrier
节点下创建一个临时节点,例如queue_barrier/host1
。
设计步骤
所有的客户端会到
queue_barrier
节点下创建一个临时节点。- 通过调用
getData()
接口获取/queue_barrier
节点的数据内容:10。 - 通过调用
getChildren()
接口获取/queue_barrier
节点下的所有子节点,同时注册对子节点变更的Watcher监听。 - 统计子节点的个数,如果子节点个数不足10个,那么就需要等待。
- 接收到Watcher通知后,重复步骤2。