如何使用Resque和Redis对队列进行优先级排序

问题描述

我的应用程序有多个队列,我正在尝试确定特定队列的优先级。

resque-pool.yml

development:
  "high_priority,med_priority,low_priority": 1

根据resque-pool文档(https://github.com/nevans/resque-pool)示例:

resque-pool.yml

foo: 1
bar: 2
"foo,bar,baz": 1

production:
  "foo,baz": 4

“这将启动七个工作进程,一个专门用于foo队列,两个专门用于bar队列,以及四个工作进程优先查看所有队列。使用上面的配置,这类似于您运行以下命令:”

rake resque:work RAILS_ENV=production QUEUES=foo &
rake resque:work RAILS_ENV=production QUEUES=bar &
rake resque:work RAILS_ENV=production QUEUES=bar &
rake resque:work RAILS_ENV=production QUEUES=foo,baz &
rake resque:work RAILS_ENV=production QUEUES=foo,baz &

我认为队列在yaml文件中的优先顺序是优先级,但也希望对其进行验证。

我将如何手动验证是否将high_priority队列中的作业优先于med_priority和low_priority队列中的作业?我是否缺少某些东西以便正确地对它们进行优先排序?

解决方法

您说对了。 Resque documentation主要状态如下:

Resque不支持数字优先级,而是使用您赋予它的队列顺序。我们将此队列列表称为“队列列表”。

比方说,我们除了file_serve队列外,还添加了warm_cache队列。我们现在开始像这样的工人:

$ QUEUES = file_serve,warm_cache rake resque:work

当工作人员寻找新工作时,它将首先检查file_serve。如果找到工作,它将进行处理,然后再次检查file_serve。它将继续检查file_serve,直到没有更多的作业可用为止。届时,它将检查warm_cache。如果找到工作,它将进行处理,然后检查file_serve(重复整个过程)。

通过这种方式,您可以确定某些队列的优先级。

请注意,在resque-pool设置中,产生的每个进程都将遵循其自己的优先级(因此,在示例配置中,如果bar个作业可以在foo个作业之前进行处理只有进程bar是空闲的,而其他进程正忙)。不过,这是一个功能,而不是错误!

关于如何测试它,只需在每个队列中排队一堆作业,然后观察它们是否在resque-web(或日志)中得到处理。