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

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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("...")

【讨论】:

是的,这似乎是正确的做法:rubydoc.info/gems/resque/1.27.4/…【参考方案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

【讨论】:

以上是关于如何破坏由resque工人排队的工作?的主要内容,如果未能解决你的问题,请参考以下文章

Rails4:为啥 resque 工人不找工作

如何清除卡住/陈旧的 Resque 工作人员?

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

ruby 清除卡住的resque工人

Rails.root 在 Resque 作业期间指向生产中的错误目录

如何在生产中部署 resque 工作者?