我正在为我的员工使用 sidekiq。假设我有一个工作人员的 10k 个作业计划,但其中 4k 个作业仅来自一个用户,我怎样才能只取消与该用户相关的作业。(假设 user_id 是作为工人的参数发送的)。
问问题
2463 次
1 回答
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 上运行之前对其进行大量测试,并且可能不要在有大量积压的队列上运行它。但在紧要关头,它可以工作。
于 2012-09-25T17:14:02.560 回答