Techioz Blog

Sidekiq with Rails - コンソールと rake タスクの異なる Sidekiq インスタンス

概要

私は Rails で非同期ジョブを扱うのが初めてで、sidekiq に慣れてきたところです。

たとえば、sidekiq に接続してキューをクリアする rake タスクを作成すると、しばらく前に自分のマシン上で別のアプリケーションの一部として作成したいくつかのカスタム名前付きキューを含む 1 セットのキューが表示されます。これらのキューには、アプリケーションによって開始されたジョブは含まれていません (メーラーでこれをテストしています)

Rails コンソールから Sidekiq に接続すると、ジョブをスケジュールするときにアプリケーションによって使用されていると思われる Sidekiq インスタンスが取得され、スケジュールしたメーラー ジョブが表示されます。

両方のシナリオから Sidekiq.redis_info を検査すると、ほぼ同じ情報が得られ、使用されている Redis サーバーも同じです。 Redis サーバーをシャットダウンすると、タスクからもコンソールからも Sidekiq に接続できなくなります。

なぜこれが起こっているのか、またどのようにすれば rake タスクから正しい Sidekiq インスタンスに接続できるのか何か考えはありますか?

Ruby 2.7.8、rails 5.2.6を使用しており、これはrailsのsidekiqの初期化子です。

rails_root = Rails.root || File.dirname(__FILE__) + '/../..'
rails_env = Rails.env || 'development'
redis_config = YAML.load_file(rails_root.to_s + '/config/redis.yml')
redis_config.merge! redis_config.fetch(Rails.env, {})
redis_config.symbolize_keys!
Sidekiq.configure_server do |config|
  config.redis = { url: "redis://#{redis_config[:host]}:#{redis_config[:port]}/12", namespace: "one-api" }

  config.super_fetch!
end

Sidekiq.configure_client do |config|
  config.redis = { url: "redis://#{redis_config[:host]}:redis_config[:port]}/12", namespace: "one-api" 
}
end

解決策

Redis はジョブが保存される場所であるため、両方のアプリが同じ Redis の場所にジョブを保存するように構成されている場合は、実行している Sidekiq のバージョンに関係なく、当然ながら古いジョブがそこに残ります。

理想的には、新しいアプリには新しい/別の Redis DB を使用する必要があります。 Sidekiq 用に Redis を構成するにはさまざまな方法がありますが、関心があるのはその数です。そのため、使用している DB (12 個?) の代わりに、デフォルトの Redis インストールで利用可能な他の 15 個の DB の 1 つを使用したいとします。 。

古いアプリをもう使用していない場合は、設定をそのままにして、適切な DB (12 DB のシェル コマンド ラインから) からすべてのキーを削除することもできます。

> redis-cli -n 12 FLUSHDB