2

我正在为我的员工使用 sidekiq。假设我有一个工作人员的 10k 个作业计划,但其中 4k 个作业仅来自一个用户,我怎样才能只取消与该用户相关的作业。(假设 user_id 是作为工人的参数发送的)。

4

1 回答 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 回答