您的位置:首页 > 产品设计 > UI/UE

disque基本流程介绍

2016-05-29 20:08 489 查看

disque基本流程介绍

disque基础

整个系统包括3个部分,生产者,disque集群,消费者,生产者将产生的消息(disque中称之为job)加入disque,然后被消费者取走,成功取得job后消费者会回复一个确认消息,基本的API和构架如下



ADDJOB queue_name job  [TTL <sec>]


queue_name:队列名

job:消息内容

TTL:失效时间,超过这个时间未被消费者取走,job失效.

GETJOB  [COUNT <count>] FROM queue1 queue2 ... queueN


COUNT:取出的job数量

queue:队列名

ACKJOB jobid1 jobid2 ... jobidN


消费者取得job后的确认回复

为了保证可用性,生产者产生的job会在多个节点上存有副本,副本数量由生产者指定。

at-least-once delivery:只要有一个副本节点可用,保证每个job都可以成功被消费者取走,在出现故障的情况下,消费者可能多次取到相同的job(job重复)

disque尽量使job按照FIFO的顺序被消费者取得,但由于故障或者负载均衡的需求并不保证这一特性。

生产者和消费者可以对集群中的任意节点发出
ADDJOB
(添加job),
GETJOB
(取得job),
ACKJOB
(确认取得job)。比如,消费者不需要从接到生产者的
ADDJOB
命令的节点取出job,同时由于节点故障或者负载均衡的原因,加入和取出的job不一定在同一个节点上完成。

为了保证at-least-once delivery,job只会在一个节点上加入队列。

主要流程图

job的状态

wait-repl:job等待复制过程完成

active:job复制过程完成尚未进入队列,对于那些接受复制job命令的节点,job状态一开始就为active

queued:job进入了队列

acked:收到了消费者确认

ADDJOB流程



1. 客户端向任意节点发送ADDJOB命令

2. Node A将job状态标记为wait-repl,随机地向几个其他节点发出REPLJOB命令,要求其复制job,收到REPLJOB的节点,将job状态标记为active,回复Node A确认收到

3. 当副本节点的数量达到要求,复制过程完成,job在Node A进入队列,状态为queued

4. 回复client addjob完成

GETJOB流程



1. 客户端向任意节点发出GETJOB

2. 若Node A中有满足GETJOB的job,从其队列中取出job,状态标记为acitve

2.1 没有满足要求的job,向其他节点广播NEEDJOB

2.2 包含job的队列所在节点收到NEEDJOB,job出队列,状态为active,向Node A回复job

3. Node A将job回复给client,getjob完成

ACKJOB流程



客户端向任意节点发出ACKJOB

Node A向所有它知道的job的复制节点发出SETACK

Node B知道的复制节点的数量比A多,回复GOTACK并告知剩下的流程又B完成

Node B向剩下的复制节点发出SETACK

收到所有复制节点的回复

向所有复制节点发出DELJOB,要求其删除job,同时在本地删除job

fast ACKJOB

从上面可以看到ACKJOB的流程较为繁琐,在网络情况比较可靠的情况下,可以使用fast ACK



收到Client的ACKJOB后直接全集群广播DELJOB,由于没有GOTACK确认,在网络故障的情况下DELJOB可能会丢失导致Job清理不完全,后续的GETJOB仍然会取到这个job。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  disque