将Docker引入Rails应用程序③【redis容器和sidekiq容器】

我所做的事情 (wǒ suǒ zuò de shì

将Redis容器和Sidekiq容器装载到Rails应用程序中。

为什么?

    • 非同期処理:時間のかかるタスクやある時間になったら実行したいタスクを「後で処理するリスト」に入れておき、他のタスクを実行しながら「後で処理するリスト」のタスクも並列で行っていく

 

    • 「後で処理するリスト」には Redis のキューがよく使われる。これから処理していく予定のジョブのデータをRedisに永続化することで、Railsプロセスが落ちたとしてもエンキューされたジョブのデータは失われない

 

    • Railsサーバと Redis と Sidekiq の関係:Railsサーバの処理の中で「後で処理するリスト」に任せたいジョブがあれば、 Redis で永続化しているキューにジョブを追加(エンキュー)し、 Sidekiq がジョブを取り出して(デキュー)実行していく

 

    ↑これらのキュー操作をさまざまな方法で実行するためにインターフェースなどを定めているフレームワークがActive Job

步骤 (Bù

    在本地运行、Sidekiq和Redis的详细配置、进行操作确认。

本地运行

安装 Redis,并启动 Redis 服务器
(在启动后,执行 Sidekiq)

$ brew install redis
$ redis-server

安装和运行Sidekiq。

# Gemfileにsidekiqを追加後
$ bundle 
$ bundle exec sidekiq

如果确认了Redis和Sidekiq已经启动,就要开始进行详细设置。

Sidekiq和Redis的详细配置

Rails和Sidekiq的整合

在开发环境中,将Sidekiq设置为队列适配器,而在测试环境中使用测试适配器,以根据不同的环境改变异步处理的行为。

# config/environments/development.rb
config.active_job.queue_adapter = :sidekiq
# config/environments/test.rb
config.active_job.queue_adapter = :test

定义Redis的位置

Sidekiq 服务器:负责从队列中取出任务并执行
Sidekiq 客户端:负责向队列添加任务

# config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { url: ENV['REDIS_URL'] }
end

Sidekiq.configure_client do |config|
  config.redis = { url: ENV['REDIS_URL'] }
end

在Sidekiq中添加路由

设置能够访问Sidekiq的仪表盘。
(装载:定义独立于主体应用程序的应用程序路由)

# config/routes.rb
if Rails.env.development?
    require 'sidekiq/web'
    mount Sidekiq::Web, at: '/sidekiq'
end

设置Sidekiq作业选项

    • ジョブの同時実行数を5にしてクラッシュ回避(デフォルトは10)

 

    ジョブは全てdefaultキューに入るようにする
# config/sidekiq.yml
:concurrency: 5
:queues:
  - default

容器定义

定义一个Sidekiq容器和一个Redis容器。

# docker-compose.yml 追加分
  web:
    environment:
      REDIS_URL: redis://redis:6379

  sidekiq:
    build: . # webコンテナと同じイメージを使用
    environment:
      REDIS_URL: redis://redis:6379
    volumes:
      - .:/karoyaka:cached
      - bundle:/usr/local/bundle
    depends_on:
      - db
      - redis
    command: bundle exec sidekiq

  redis:
    image: redis:latest
    ports:
      - 6379:6379
    volumes:
      - redis:/data

volumes:
  redis:

确认行动

启动容器,创建示例作业,重新启动容器并使示例作业可识别。
在Rails控制台中注册作业,然后查看仪表板(http://localhost:***/sidekiq)。

$ docker-compose up
$ docker-compose run web rails g sidekiq:job sample
$ docker-compose up
$ docker-compose run web rails c
irb(main)> SampleJob.perform_async

我确认Sidekiq容器和Redis容器正常运行。

请参考。

    • Sidekiqってどんなキック?

 

    • Sidekiq GitHub

Rails 6の新しいデフォルト設定と安全な移行方法を詳しく解説(翻訳)(Active Storage + Sidekiq)]
Understanding Background Job in Rails with Sidekiq
Sidekiqの導入手順【令和版】
gem Sidekiqの導入
docker-composeでRails+PostgreSQL+Redis+Sidekiq環境を作る

广告
将在 10 秒后关闭
bannerAds