6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2021年9月14日 現場Rails Chapter7 非同期処理や定期実行を行う(Jobスケジューリング)

非同期処理とは?

非同期処理とは、あるタスクが実行している際に同時にバックグラウンドで他のタスクを実行できる方式です。

例えば、処理が重く時間が掛かるタスクを非同期処理として裏で動作させ、ユーザーに見える処理では処理の受付だけを行わせることで、ユーザーは受付をしながら非同期処理の結果を待つことが出来ます。結果として、ユーザーがただ何もしないで待つ時間を減らすことが出来ます。 例:非同期処理を用いたメールの送信

対して、同期処理とは?

1つずつ順番にタスクが実行される処理のことです。同時に2つ以上の処理を行うことはできず、1つの処理が終わるまで、もう1つの処理は待つ必要があります。

Active Jobとは?

バックグラウンドでさまざまな処理を非同期に行うための共通フレームワークのことです。  

Active Jobを使うメリットは、非同期処理を行うための様々なGem(sidekiq, Resque, Delayedjob)の記述方法や機能の違いを気にすることなく、非同期処理が行えることです。つまり、Active Jobを使うことで、どのGemを使用しても同じように非同期通信が行えます。

詳しくはRailsガイド

Redisとは

Redisはオープンソースの永続化可能なインメモリデータベース(In-memory database)で、BSDライセンスで公開されています。 特徴はインメモリ型データ構造ストアであること、そしてデータの永続化ができることといえるでしょう。 メモリ上で動作するキーバリューストア型のデータベースです。

Sidekiqとは

wikipediaで詳しく説明されているので、以下に引用します。

SidekiqはRubyで書かれたオープンソースのジョブスケジューラです。デフォルトではスケジューリングは行わず、ジョブの実行のみを行います。エンタープライズ版では、スケジューリング機能が搭載されています。

Sidekiqを使用するためには、sidekiqというgemをインストールします。

sidekiqのインストール

redisをbrew経由でインストール後、Gemのsidekiqのインストールを行います。

$ brew install redis
gem 'sidekiq' # bundle install

インストールしたらRailsとSidekiqを連携するために以下のように追記を行います。

# config/environments/development.rb
(略)
  config.active_job.queue_adapter = :sidekiq
end

下記のコマンドでジョブの雛形を生成します。

$ bin/rails g job sample

performメソッド内部に、非同期で実行したい処理を書きます。

# sample_job.rb
class SampleJob < ApplicationJob
  queue_as :default

  def perform(*args)
    Sidekiq::Logging.logger.info "ジョブを実行しました。"
  end
end

Railsアプリケーションからperformメソッドの処理を呼び出すと、ジョブを登録できます。

def create
  @task = current_user.tasks.new(task_params)
  ...
  if @task.save
    TaskMailer.created_email(@task).deliver_now
    # 以下の一文で、performメソッドを呼び出せます。
    Sample.Job.perform_later 
    redirect_to @task, notice: "タスク「#{@task.name}」を登録しました。"
  else
    render :new
  end
end

ジョブは実行する時間を予約することも可能です。

# 明日の正午に実行
SampleJob.set(wait_until: Date.tomorrow.noon).perform_later

# 1時間後に実行
SampleJob.set(wait: 1.hour).perform_later

雑学🤘🏽

スケーラビリティとは拡張性という意味です。

スケーラビリティ考慮してこ!!🙆🏽‍♂️

スタックとキューについて

Sidekiqでは、複数のジョブを並列して実行することができるのですが、キュー(queue)をいう仕組みを使ってそのジョブをどのような優先順位で実行するのか決めています。

スタックキューも、「データの持ち方 (データ構造)」のことで、どのようにpop(データを取り出すか)に違いがあります。

キューとは?

データ構造に入っている要素のうち、最初に push した要素から順に取り出します。(popする)

スタックとは?

データ構造に入っている要素のうち、最後に push した要素から順に取り出します。(popする)

参照

BSDライセンス wikipedia

インメモリデータベース

【Active Job】Sidekiq vs Resque vs Delayed Job

Railsガイド Active Job

Rails:Sidekiqを用いて非同期処理を実行する

スタックとキューを極める! 〜 考え方と使い所を特集 〜

Railsで非同期処理を行える「Sidekiq」