分布式队列分为两大类。
(1) FIFO先入先出队列模型
(2)等待队列元素聚集后,统一安排处理执行的Barrier模型

FIFO先入先出

FIFO队列模型

先进入队列的请求操作先完成,才会开始处理后面的请求。

Zookeeper实现FIFO队列

设计思路

所有的客户端都到 /queue_fifo 这个节点下面创建一个临时顺序节点,例如 /queue_fifo/host1-000001
image.png

设计步骤

  1. 通过调用 getChildren() 接口获取 /queue_fifo 节点的所有子节点,即获取队列中所有元素。
  2. 确定自己的节点序号在所有子节点中的顺序。
  3. 如果自己的序号不是最小,那么就需要等待,同时向比自己序号小的最后一个子节点注册Watcher监听。
  4. 接收到Watcher通知,重复步骤1。

    Barrier:分布式屏障

    分布式屏障模型

    在分布式系统中,Barrier特指系统之间的一个协调条件,规定了一个队列的元素必须都集齐后才能统一进行安排,否则就会一直等待。这往往出现在那些大规模分布式并行计算的应用场景中,最终的合并计算需要基于很多并行计算的资结果来进行。

    Zookeeper实现分布式屏障

    设计思路

    开始时, queue_barrier 节点是一个已经存在的默认节点,并且将其节点的数据内容复制为一个数字n来代表Barrier值。例如n=10表示只有当 queue_barrier 节点的子节点个数达到10个后,才会打开Barrier。
    之后,所有的客户端都会到 queue_barrier 节点下创建一个临时节点,例如 queue_barrier/host1
    image.png

    设计步骤

  5. 所有的客户端会到 queue_barrier 节点下创建一个临时节点。

  6. 通过调用 getData() 接口获取 /queue_barrier 节点的数据内容:10。
  7. 通过调用 getChildren() 接口获取 /queue_barrier 节点下的所有子节点,同时注册对子节点变更的Watcher监听。
  8. 统计子节点的个数,如果子节点个数不足10个,那么就需要等待。
  9. 接收到Watcher通知后,重复步骤2。

代码实现

参考博客
gitgub地址(代码实现)