disque基本流程介绍

来源:互联网 发布:asp.net vb 教程 编辑:程序博客网 时间:2024/06/05 05:41

disque基本流程介绍

disque基础

  1. 整个系统包括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后的确认回复
  2. 为了保证可用性,生产者产生的job会在多个节点上存有副本,副本数量由生产者指定。
  3. at-least-once delivery:只要有一个副本节点可用,保证每个job都可以成功被消费者取走,在出现故障的情况下,消费者可能多次取到相同的job(job重复)
  4. disque尽量使job按照FIFO的顺序被消费者取得,但由于故障或者负载均衡的需求并不保证这一特性。
  5. 生产者和消费者可以对集群中的任意节点发出ADDJOB(添加job),GETJOB(取得job),ACKJOB(确认取得job)。比如,消费者不需要从接到生产者的ADDJOB命令的节点取出job,同时由于节点故障或者负载均衡的原因,加入和取出的job不一定在同一个节点上完成。
  6. 为了保证at-least-once delivery,job只会在一个节点上加入队列。

主要流程图

job的状态

  1. wait-repl:job等待复制过程完成
  2. active:job复制过程完成尚未进入队列,对于那些接受复制job命令的节点,job状态一开始就为active
  3. queued:job进入了队列
  4. 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流程

  1. 客户端向任意节点发出ACKJOB
  2. Node A向所有它知道的job的复制节点发出SETACK
  3. Node B知道的复制节点的数量比A多,回复GOTACK并告知剩下的流程又B完成
  4. Node B向剩下的复制节点发出SETACK
  5. 收到所有复制节点的回复
  6. 向所有复制节点发出DELJOB,要求其删除job,同时在本地删除job

fast ACKJOB

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

收到Client的ACKJOB后直接全集群广播DELJOB,由于没有GOTACK确认,在网络故障的情况下DELJOB可能会丢失导致Job清理不完全,后续的GETJOB仍然会取到这个job。

0 0
原创粉丝点击