Zenn
🙌

RedisとSidekiqを導入してみた

に公開1

はじめに

お疲れ様です。
今回はバッチ処理のために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

ログインするとコメントできます