Techioz Blog

ジョブ内の Sidekiq 再試行回数

概要

現在のジョブの再試行回数を取得する方法はありますか?

x 回再試行した後、ジョブがクラッシュするのではなく停止するようにしたいと考えています。再試行回数が x に等しい場合に単純に返すことができるように、perform メソッドで再試行回数を問い合わせたいと考えています。

def perform(args)
  return if retry_count > 5
  ...
end

Sidekiq 2.12 を使用します。

私(OPではありません)は同じ質問をしていますが、理由は異なります。ジョブが再試行されている場合は、追加の健全性チェックを実行してジョブが必要であることを確認し、キューに入れられてから外部で何かが変更されたためにジョブの成功が期待されなくなった場合は再試行を中止したいと考えています。

では、現在のジョブの再試行回数を取得する方法はあるのでしょうか?現在の回答は、必要なときに回避できる方法、または仕事の外から入手できる方法を示唆しているだけです。

解決策

これは、sidekiq ミドルウェアを追加して msg[‘retry_count’] をジョブ クラスのインスタンス変数として設定することで実現できます。

次のようにミドルウェアを追加します (Rails では、通常は /config/initializers/ フォルダー内のファイルです)。

class SidekiqMiddleware
    def call(worker, job, queue)
        worker.retry_count = job['retry_count'] if worker.respond_to?(:retry_count=)
        yield
    end
end

Sidekiq.configure_server do |config|
    config.server_middleware do |chain|
        chain.add SidekiqMiddleware
    end
end

あなたの仕事では:

include Sidekiq::Worker
attr_accessor :retry_count

def retry_count
  @retry_count || 0
end

def perform(args)
  return if retry_count > 5
  ...
end