将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環境を作る