Active Jobとは
- Railsの内部フレームワーク。
- ジョブを宣言し、バックエンドでさまざまな方法によるキュー操作を行うための共通インターフェース。
リンク:
ジョブとは
- 「コマンドやプログラムがまとまった、ひとかたまりの処理」のこと。
- 端末ごとに見た一連の処理。
- プロセスが1つもしくは複数集まって1つのジョブができているイメージ。
- プロセスと同様
kill
コマンドで停止できる。
- コンピュータはマルチタスクなため、ジョブは並列実行することが可能。
- 例: メール送信、CSVアップロードなど。
フォアグラウンドジョブ
- 今操作しているアプリケーション。
- 例: ChromeやFirefoxなどのブラウザ。
バックグラウンドジョブ
- フォアグラウンドジョブ以外のジョブ。
- 例: ChromeやFirefoxなどのブラウザに対する端末。
リンク:
バックエンド(バックグラウンド)とは
- ここではRailsのアプリケーションサーバー(Unicornやpumaなど)のプロセスとは別に、ジョブを実行するために立ち上げられるプロセスのこと。またはそのプロセスを立ち上げるキューイングシステム(DelayedJob、Resque、Sidekiqなど)。
- 非同期処理される環境。
リンク:
キューとは
First in, first outのデータ構造。
※ 誤解を招く表現になりそうだが、取り出し方の決まっている配列のようなものというイメージ。
Active Jobは何がうれしいのか?
- Delayed JobとResqueなどの、さまざまなジョブ実行機能のAPIの違いを気にせずにジョブフレームワーク機能やその他のgemを搭載することができるようになる。
- バックエンドでのキューイング作業では、操作方法以外のことを気にせずに済む。
- ジョブ管理フレームワークを切り替える際にジョブを書き直さずに済む。
ジョブ管理フレームワークの種類
以下の3つはジョブキュー処理の主要gem。
Resque
良い点
- RMagickなどのメモリリークが存在するコードでも不安なくデプロイできる。
- エコシステムが出来上がってる。
悪い点
- 毎回forkするので長時間ジョブ向き。
- キューのストレージとしてRedisが必要。
- メンテが追いついてない。
Delayed Job
良い点
- 特になし。
悪い点
- DMに専用テーブル作成が必要。
- メモリリークしてるコードがあれば定期的な再起動が必要。
Sidekiq
良い点
- Resque互換API。
- 並列に動作するので、外部サイトへのAPI呼び出しなど、I/O待ちの比率が大きいような用途で使うのに便利。
- 1個のプロセスで動作させられるのでメモリ使用量が少なく経済的。
悪い点
- プロセス肥大化には弱い。
- コネクションプールの扱い。
- 並列以外の扱い。
リンク:
- ジョブキュー処理のResqueとDelayed Jobの使い分けの方針などはありますか?
- rubyで非同期処理
- 【Active Job】Sidekiq vs Resque vs Delayed Job - Zenn
- 【Rails】ActiveJob/DelayedJobを使いこなす【基本】
- SidekiqでRailsに非同期処理を実装するチュートリアル - Qiita
- Sidekiqの要点まとめと動かし方
- sidekiqを使用する際に注意したい覚え書き
ジョブの作成
$ bin/rails generate job InvoiceIssuing
invoke test_unit
create test/jobs/invoice_issuing_job_test.rb
create app/jobs/invoice_issuing_job.rb
class InvoiceIssuingJob < ApplicationJob
queue_as :default
def perform(*guests)
# 後で実行するタスクをここに置く
end
end
ジョブの実行
デフォルトのキューイングの振る舞い
- Rails自身がデフォルトで提供するのは、ジョブをメモリ(アプリケーションサーバーのプロセス内)に保持するキューイングシステムだけ。
- プロセスがクラッシュしたりコンピュータをリセットしたりすると、デフォルトの非同期バックエンドの振る舞いによって主要なジョブが失われてしまう。
- つまりバックグラウンドジョブやRailsのサーバー自体が止まったりする。
- プロセスがクラッシュしたりコンピュータをリセットしたりすると、デフォルトの非同期バックエンドの振る舞いによって主要なジョブが失われてしまう。
- アプリケーションが小規模な場合やミッションクリティカルでないジョブであればこれでも構いませんが、多くのproduction環境においては永続的なバックエンドを選ぶ必要がある。
production環境のキューイング
- production環境でのジョブのキュー登録と実行では、「キューイングバックエンド」(= キューイング用のgem)を選び、起動しておく必要がある。
- Sidekiq
- Resque
- Delayed Jobなど
キュー
- 多くのアダプタでは複数のキューを扱える。
- Active Jobを使うと、特定のキューに入っているジョブを制御したりできる。
その他
コールバック
ActiveRecordのコールバックと同じようにライフサイクル中にロジックをトリガできる。
Action Mailer
代表的なジョブ。Active JobはAction Mailerと統合されているので、非同期メール送信を簡単に行える。