【问题标题】:How to destroy jobs enqueued by resque workers?如何破坏由resque工人排队的工作?
【发布时间】:2011-08-18 08:48:34
【问题描述】:

我在 rails-3 项目中使用 Resque 来处理计划每 5 分钟运行一次的作业。我最近做了一些事情,使这些工作的创建滚雪球,堆栈已经达到了 1000 多个工作。我修复了导致许多作业排队的问题,现在我遇到的问题是错误创建的作业仍然存在,因此由于作业被添加到具有 1000 多个作业的队列中,因此很难测试某些内容。 我似乎无法停止这些工作。我尝试使用 flushall 命令从 redis-cli 中删除队列,但没有成功。我错过了什么吗?因为我似乎找不到摆脱这些工作的方法。

【问题讨论】:

    标签: ruby-on-rails-3 scheduled-tasks redis resque


    【解决方案1】:

    如果你打开一个 Rails 控制台,你可以运行这个代码来清除你的队列:

    queue_name = "my_queue"
    Resque.redis.del "queue:#{queue_name}"
    

    【讨论】:

    • 在下面@denmarkin 的回答中找到,使用 Resque.redis.del 而不是 Resque.redis.delete
    【解决方案2】:

    更新 rake 任务进行清理(根据最新的 redis 命令更改):https://gist.github.com/1228863

    【讨论】:

      【解决方案3】:

      根据上述答案,如果您需要清除所有队列,您可以使用以下方法:

      Resque.queues.each{|q| Resque.redis.del "queue:#{q}" }
      

      【讨论】:

        【解决方案4】:

        Resque 已经有一种方法可以做到这一点 - 试试Resque.remove_queue(queue_name)(请参阅文档here)。它在内部执行Resque.redis.del(),但它也执行其他清理工作,并且通过使用 api 方法(而不是对 resque 的工作方式做出假设),您将更加面向未来。

        【讨论】:

        • 使用 Resque API 是一种更好的方法
        【解决方案5】:

        这就是现在的效果:

        Resque.remove_queue("...")
        

        【讨论】:

        【解决方案6】:

        进入redis控制台:

        redis-cli
        

        列出数据库:

        127.0.0.1:6379> KEYS *
         1) "resque:schedules_changed"
         2) "resque:workers"
         3) "resque:queue:your_overloaded_queue"
        

        "resque:queue:your_overloaded_queue" - 你需要的数据库。

        然后运行:

        DEL resque:queue:your_overloaded_queue
        

        或者,如果您想删除队列中的指定作业,请使用 LRANGE 命令从 db 中列出几个值:

        127.0.0.1:6379> LRANGE resque:queue:your_overloaded_queue 0 2
        1) "{\"class\":\"AppClass\",\"args\":[]}"
        2) "{\"class\":\"AppClass\",\"args\":[]}"
        3) "{\"class\":\"AppClass\",\"args\":[]}"
        

        然后将一个值复制/粘贴到LREM 命令:

        127.0.0.1:6379> LREM resque:queue:your_overloaded_queue 5 "{\"class\":\"AppClass\",\"args\":[]}"
        (integer) 5
        

        其中 5 - 要删除的元素数。

        【讨论】:

        • Redis 建议您使用not run KEYS * on a production database,因为它会扫描整个密钥集并锁定所有记录。这可能会对您在非常繁忙的系统上的后台工作人员产生不利影响。
        【解决方案7】:

        使用 Resque API 比删除 Resque 的 Redis 上的所有内容更安全和防弹。 Resque 在内部进行了一些清洁。

        如果您想删除所有队列和相关的入队作业:

        Resque.queues.each {|queue| Resque.remove_queue(queue)}
        

        队列将在下次作业入队时重新创建。

        Documentation

        【讨论】:

          猜你喜欢
          • 2012-09-14
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          • 1970-01-01
          • 2012-01-25
          • 1970-01-01
          • 2012-10-05
          • 1970-01-01
          相关资源
          最近更新 更多