Sidekiq がキューに入れられたジョブを実行しない (Rails 7 + Redis + Sidekiq + Docker)
概要
タイトルにあるように、docker で 3 つのコンテナーが実行されています。1 つは Rails 用、1 つは postgres db 用、1 つは Redis 用です。 Job.perform_async を実行してジョブをキューに入れることはできますが、何らかの理由でジョブが無期限にキューに入れられたままになります。確認したところ、Redis コンテナーは起動して実行されています。
私の仕事:
class HardJob
include Sidekiq::Job
def perform(*args)
puts 'HardJob'
end
end
Sidekiq の初期化子:
Sidekiq.configure_server do |config|
config.redis = { url: (ENV["REDIS_URL"] || 'redis://localhost:6379') }
end
Sidekiq.configure_client do |config|
config.redis = { url: (ENV["REDIS_URL"] || 'redis://localhost:6379') }
end
私のdocker-compose:
version: '3.0'
services:
web:
build: .
entrypoint: >
bash -c "
rm -f tmp/pids/server.pid
&& bundle exec rails s -b 0.0.0.0 -p 3000"
ports:
- 3000:3000
volumes:
- .:/src/myapp
depends_on:
- db
- redis
links:
- "db:db"
environment:
REDIS_URL: 'redis://redis:6379'
db:
image: postgres:11
environment:
POSTGRES_PASSWORD: 'postgres'
volumes:
- db_data:/var/lib/postgresql/data
ports:
- 5432:5432
redis:
image: "redis"
volumes:
db_data:
redis:
driver: local
また、私の 3 つの環境では config.active_job.queue_adapter = :sidekiq も設定しました。
ここで何が起こっているのかについて何かヒントはありますか?前もって感謝します
アップデート
私のrailsターミナルでsidekiq -qdefaultを実行すると機能したようです。常にsidekiqを実行するようにDockerを構成するにはどうすればよいですか?
解決策
Sidekiq は独自のプロセスであり、Web サーバー プロセスと同様に、独自に開始する必要があります。次のようなものを docker-compose に追加します。
sidekiq:
depends_on:
- 'db'
- 'redis'
build: .
command: bundle exec sidekiq
volumes:
- .:/src/myapp
environment:
- REDIS_URL_SIDEKIQ=redis://redis:6379/1
または、Sidekiq の最新バージョン (>= 7.0) を使用できる場合は、Sidekiq を puma Web サーバーと一緒に実行する新しい Sidekiq 組み込みモードを試してみるとよいでしょう。