我正在尝试了解Resque的排序逻辑。我相信每个队列都是基于FIFO处理的(标准队列行为),但是我说有几个队列 - 都有待处理的作业 - 还有两个工作人员处理“*”(即所有队列)。
什么算法决定接下来要处理哪个作业?如果它是一个通用的FIFO,它将是任何队列中最老的工作,但它看起来像是在进行某种类型的队列轮换。
答案 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个列表或队列king
和queen
考虑以下情景
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以获取更多信息
希望这有意义