与多个工人的Resque:什么顺序?

时间:2013-07-09 16:36:20

标签: ruby scheduled-tasks resque

我正在尝试了解Resque的排序逻辑。我相信每个队列都是基于FIFO处理的(标准队列行为),但是我说有几个队列 - 都有待处理的作业 - 还有两个工作人员处理“*”(即所有队列)。

什么算法决定接下来要处理哪个作业?如果它是一个通用的FIFO,它将是任何队列中最老的工作,但它看起来像是在进行某种类型的队列轮换。

2 个答案:

答案 0 :(得分:2)

请参阅https://github.com/resque/resque/blob/master/lib/resque/multi_queue.rb

如果它在阻塞模式下工作(默认情况下是这样),那么它使用Redis'BLPOP方法,该方法接受队列列表,并将弹出并从第一个队列返回一个值以获取数据

Redis'BLPOP以先到先得的方式为客户排队。当给定多个队列密钥时,它只是遍历它们并设置每个密钥的阻塞。见https://github.com/antirez/redis/blob/unstable/src/t_list.c#L781-815

Resque将通过获取类似SMEMBERS queues的内容来构建要测试的队列列表,这意味着队列将按照SMEMBERS命令返回的顺序排列优先级。这是一个set操作,这意味着它的顺序是不确定的;你主要是在Redis的怜悯之下。

答案 1 :(得分:1)

也许你应该知道一点redis,因为resque内部用户[blpop][1]检查here

现在blpop如何工作让您说有2个列表或队列kingqueen

考虑以下情景

1) when one or more message exist in `king` and `queen` has no message i.e empty

  blop would pop a single message from `king` 

2) when `queen` has one or more message but `king` doesnt 

  blop would pop a message from `queen`

3) when but `king` or `queen` both has message in them. 

now the order of queues decide from which the message would be popped 

Let say `king` has 3 message and `queen` has 2 message 

and let say the order is 

redis.blpop "king","queen",0

blop would pop message from `king` 3 times(until it has no longer message in them) and then would pop the message from queue name "queen"

您可以在列表和blop上引用redis documentation以获取更多信息

希望这有意义