Techioz Blog

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 組み込みモードを試してみるとよいでしょう。