以编程方式获取 Resque 队列中的作业数

Posted

技术标签:

【中文标题】以编程方式获取 Resque 队列中的作业数【英文标题】:Programmatically get the number of jobs in a Resque queue 【发布时间】:2012-06-29 10:08:50 【问题描述】:

我有兴趣设置一个监控服务,只要 Resque 队列中有太多作业(我有大约 6 个队列,每个队列都有不同的编号),它就会呼叫我。我还想设置一个非常相似的监控服务,当我的队列中超过一定数量的失败作业时会提醒我。

我的问题是,我在我的 redis 服务器上看到了很多与 Resque 相关的密钥和混乱。我不一定看到一种直接的方法来获取每个队列的作业数或​​失败的作业数。目前有没有一种简单的方法可以从 redis 中获取这些数据?

【问题讨论】:

是否也可以获取每个队列的运行时间?比如,队列运行了多长时间? 【参考方案1】:

是的,这很容易,因为您使用的是Resque gem:

require 'resque'

Resque.info 

将返回一个哈希

例如/ =>


      :pending => 54338,
      :processed => 12772,
      :queues => 2,
      :workers => 0,
      :working => 0,
      :failed => 8761,
      :servers => [
      [0] "redis://192.168.1.10:6379/0"
    ],
    :environment => "development"

所以要获得失败的作业计数,只需使用:

Resque.info[:failed]

这会给 => 8761 #在我的例子中

要获取队列,请使用:

Resque.queues

返回一个数组

例如/ =>

[
    [0] "superQ",
    [1] "anotherQ"
]

然后您可以找到每个队列的作业数:

Resque.size(queue_name)

例如/Resque.size("superQ")Resque.size(Resque.queues[0]) .....

【讨论】:

感谢您提供非常有用的帖子 救了我的命!谢谢! 这看起来很棒,但它似乎并没有像我在 Resque Web 中看到的那样给我当前的失败作业数量。即使我已经删除了它们,它看起来更像是失败作业的历史计数。 对于希望获得当前失败的工作而不是总数的其他人,您可以使用Resque::Failure.count【参考方案2】:

这是一个 bash 脚本,它将监控排队的作业总数和失败的作业数。

while :
do 
  let sum=0
  let errors=$(redis-cli llen resque:failed)
  for s in $(redis-cli keys resque:queue:*)
  do 
    let sum=$sum+$(redis-cli llen $s)
  done
  echo $sum jobs queued, with $errors errors
  sleep 1 # sleep 1 second, probably want to increase this
done

这适用于 Resque 1.X,2.0 可能有不同的键名。

【讨论】:

【参考方案3】:

还有一个方法Resque.queue_sizes,它返回队列名称和大小的哈希

Resque.queue_sizes => "默认"=>0, "慢"=>0

【讨论】:

以上是关于以编程方式获取 Resque 队列中的作业数的主要内容,如果未能解决你的问题,请参考以下文章

Spark:以编程方式获取集群核心数

以编程方式获取GitlabCI作业的结果

Resque作业,如何停止正在运行的作业

如何破坏由resque工人排队的工作?

以编程方式检查Oracle AQ队列是否存在

PHP的轻量消息队列php-resque使用说明