非同期実行 Sidekiqの導入 Mac Ubuntu

はじめに

ついに弊社でもsidekiqを導入することにしました。(おせえよ)
導入に至った経緯はこんな感じ。

  • rundeckでバッチを定期的に起動している
  • バッチが増え的たら重くて動かなくなった(一応動くけど)
  • rundeckがおもい原因は重大なメモリ不足
  • メモリ不足の原因は数時間かかるバッチのレスポンスをひたすら待っているから
  • sidekiqに蹴り飛ばすしかねえ

という感じなのですが、今後の非同期実行処理にもかなり有用なので積極的に取り入れていきたいですね。
※レスポンスが必要な処理には向いてませんので何でもかんでもはNG。

(注意)かなり手探りでふわっとしています。
(注意)作業ログなので殴り書きチックです。

ローカルの環境設定と実装

sidekiq使うにはredisが必要です。
redisはNoSQLデータベースでsidekiqのジョブの管理とかに使ってます。
最低限のことしか設定してないんで、各自不便に思ったところは調べて改造してください。

Macにredisをインストール

$ brew install redis

gemの追加

sinatraはダッシュボードを見るために必要です。

# sidekiq
gem 'sidekiq'
gem 'sinatra', require: false
gem 'redis-namespace'
$ bundle install

設定ファイルの用意

# config/initialize/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://127.0.0.1:6379', namespace: 'sidekiq' }
end

Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://127.0.0.1:6379', namespace: 'sidekiq' }
end

ワーカーの作成

generateで作っても普通にファイル作ってもOK。
こいつにぶん投げることになります。

$ rails g sidekiq:worker Update
#/app/workers/get_info_worker.rb

class UpdateWorker
  include Sidekiq::Worker

  def perform
    update_service = Products::UpdateService.new
    update_service.execute
  end
end

コントローラーの修正

さっき作ったワーカーにぶん投げます。

def product_update
  UpdateWorker.perform_async
  render json: { result: sidekiq_web_url }.to_json
rescue StandardError => e
  raise e
end

routesの修正

ダッシュボード見るために設定します。

# routes.rb
require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq'

redisの起動

$ redis-server

スクリーンショット 2018-11-15 16.24.07.png

sidekiqの起動

$ bundle exec sidekiq

スクリーンショット 2018-11-15 16.24.01.png

完了!

http://localhost:3000/sidekiq
でダッシュボードが確認できます。

スクリーンショット 2018-11-15 16.10.29.png

本番環境設定

今回の対象は
Ubuntu 16.04.5 LTSです。

redisの設定

まずはインストール。

$ sudo apt install redis-server

完了して、

$ sudo service redis start

がエラーなく実行できればOKです。

sidekiqの設定

$ bundle install

これでOK。最高

デーモンで起動

$ bundle exec sidekiq --daemon --environment=production --logfile /project/[rails_project]/log/sidekiq.log

まとめ

難しすぎる…
これからうまく使えるようになればと思いましたねえ!!!

Qiitaで見たい方はこちら