我正在为我的工人使用sidekiq。假设我有一个单独的工作人员有10k个工作计划,但是这些工作中只有4k来自一个用户,我怎么才能取消与该用户相关的工作。 (让我们说user_id是作为工人的参数发送的。)
答案 0 :(得分:1)
这可能是一种更有效的方法,但您可以做的是迭代当前队列中的作业,并删除符合条件的作业,如下所示:
def delete_jobs_by_user_id(queue, user_id)
Sidekiq.redis do |r|
queue_key = "queue:#{queue}"
jobs = r.lrange(queue_key, 0, -1)
jobs.each do |job|
r.lrem(queue_key, 0, job) if JSON.load(job)['args'].include?(user_id)
end
end
end
如果您正在寻找的课程,arg处于正确的位置等等,您还需要添加更多支票才能删除作业,但这样可以让您走上正确的轨道。
显然在prod上运行之前测试了这一堆,并且可能不会在具有大量积压的队列上运行它。但是在紧要关头,它可以发挥作用。