2

ワーカーに sidekiq を使用しています。1 人の個々のワーカーに 10,000 のジョブ スケジュールがあるとしますが、そのうちの 4,000 のジョブは 1 人のユーザーからのものであり、そのユーザーに関連するジョブだけをキャンセルするにはどうすればよいでしょうか。(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

ジョブが探しているクラスである場合、引数が正しい位置にある場合などにのみジョブを削除するために、いくつかのチェックを追加する必要がありますが、これで正しい軌道に乗ることができます。

そして明らかに、本番環境で実行する前にこれをたくさんテストしてください。おそらく、膨大なバックログがあるキューで実行しないでください。しかし、ピンチでは、それが機能する可能性があります。

于 2012-09-25T17:14:02.560 に答える