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する)