如何破坏由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 runKEYS *
on a production database,因为它会扫描整个密钥集并锁定所有记录。这可能会对您在非常繁忙的系统上的后台工作人员产生不利影响。【参考方案7】:
使用 Resque API 比删除 Resque 的 Redis 上的所有内容更安全和防弹。 Resque 在内部进行了一些清洁。
如果您想删除所有队列和相关的入队作业:
Resque.queues.each |queue| Resque.remove_queue(queue)
队列将在下次作业入队时重新创建。
Documentation
【讨论】:
以上是关于如何破坏由resque工人排队的工作?的主要内容,如果未能解决你的问题,请参考以下文章