🙌
RedisとSidekiqを導入してみた
はじめに
お疲れ様です。
今回はバッチ処理のためにRedisとSidekiqをRailsで導入しようと思います。
なぜバッジ処理なのかというと、現在引き続き作成している掲示板のポストに対する投票機能を毎回データベースにアクセスしていると負荷がかかるためバッジ処理を使うことで負荷を減らそうと考えました。
前提
フロントエンド:TypeScript, React
バックエンド:Rails API
Docker
導入
gemfileにredisとSidekiqを追加してdockerのコンテナ内でbundle installを行う。
gem 'redis'
gem 'sidekiq'
docker-compose exec backend bundle install
その後、docker-compose.ymlにredisとSidekiqの設定の追加を行う
version: "3.8"
services:
redis:
image: redis:alpine
ports:
- "6379:6379"
backend:
build: ./backend
container_name: rails_api
command: bash -c "rm -f tmp/pids/server.pid && bin/rails server -b 0.0.0.0"
ports:
- "3000:3000"
volumes:
- ./backend:/rails
- bundle_cache:/usr/local/bundle
environment:
- RAILS_ENV=development
- REDIS_URL=redis://redis:6379/0
depends_on:
- db
- redis
sidekiq:
build: ./backend
container_name: sidekiq
command: bundle exec sidekiq
volumes:
- ./backend:/rails
- bundle_cache:/usr/local/bundle
environment:
- RAILS_ENV=development
- REDIS_URL=redis://redis:6379/0 # Sidekiq が Redis を使えるように設定
depends_on:
- backend
- redis
そして、SidekiqをActiveJobのバックエンドに設定するために、
config/application.rbのApplicationクラス内にこの行を追加する
config.active_job.queue_adapter = :sidekiq
これで、ActiveJobがsidekiqを使ってジョブを実行するようになる。
※ActiveJobは、Railsのフレームワークで時間のかかる処理などをバックエンドで実行してくれるらしい
最後に、config/initializers/sidekiq.rbに
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://redis:6379/0' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://redis:6379/0' }
end
こう書くことで、SidekiqがRedisに接続できるようになる。
あとは、app/jobsフォルダ内にバッジ処理を書いて完成。
Discussion
参考