BackEnd

Railsでの非同期処理とDelayed Job

投稿日:2018年9月25日 更新日:

はじめに

大量なデータのインポートやメールの送信など、処理時間が長くなるタスクを実行する際は非同期で実行することが多いと思います。RailsではActive Jobという便利な仕組みにより、非同期処理を簡単に実装することができます。

Active Job単体でも使用することはできますが、プロセスがクラッシュしたりコンピュータをリセットしたりするとジョブが失われてしまいます。そのため、production環境では後に紹介するDelayed JobやSidekiqなどのライブラリと合わせて使用することが一般的です。

先日、業務でDelayed Jobを使う機会がありましたので、今回はActive Jobの基本的な説明と、バックエンドでジョブを実行するためのライブラリの一つであるDelayed Jobを紹介します。

Active Job

Active Jobは、ジョブを宣言し、それによってバックエンドでさまざまな方法によるキュー操作を実行するためのフレームワークです。

大量なデータのインポートやメールの送信など、様々な処理を非同期で並列的に実行できます。より詳しい説明はこちらから見ることができます。

Active Jobの役割

Active Jobの主な役割はジョブの処理とジョブ管理機能の制御を分離することです。これにより、ジョブの処理はジョブを実行する(SidekiqやDelayed Jobなど)のキューを管理するライブラリを意識する必要がなくなり、ジョブ管理機能ではキューの操作方法以外のことを気にする必要がなくなります。

さらに、ジョブごとに複数のキューを管理するライブラリを採用することができ、それらのライブラリを切り替える際にコードを書き換える必要がなくなります。

ジョブを作成する

ジョブはコントローラやモデルなどと同じようにRailsジェネレータで生成することができます。以下のコマンドを実行するとapp/jobsにジョブが生成されます。

生成されたコードは以下のとおりです。

ジョブをキューに登録する

キューへのジョブの登録は以下のように行います。

また、ジョブに引数を渡す場合は以下のように行います。

コールバック

Active Jobが提供するフックを用いて、以下のようにジョブのライフサイクル中に任意の処理を実行することができます。

利用できるコールバックは以下のとおりです。

  • before_enqueue
  • around_enqueue
  • after_enqueue
  • before_perform
  • around_perform
  • after_perform

例外

ジョブの実行中に起こった例外は以下のようにキャッチする事ができます。

例外が発生したときに以下のようにジョブのリトライや破棄も行なえます。

Delayed Job

Delayed Jobはジョブを実行するためのライブラリの一つです。

設定

まず、以下のGemをGemfileに追加してbundle installします。

次に、ジョブのキューを保存するためのテーブルを作ります。

実行すると下記のテーブルが作られます。

最後に、Active Jobと連携させるための設定をapplication.rbに追加します。

ワーカーの起動

Delayed Jobを設定しただけではジョブを処理することはできません。以下のコマンドでワーカーを起動させます。

その他のライブラリとの比較

Delayed Jobの他によく使われるライブラリとしてはSidekiqやResqueなどがあります。Delayed JobとこれらのGemの大きな違いとしては、Delayed Jobがキューの管理にDBを用いるのに対して、これら2つはRedisで管理します。Delayed JobはRedisを使用しないため容易に利用できますが、ジョブの処理に時間がかかります。上記の理由により、非同期処理を多用するサイトではSidekiqやResqueなどを使ったほうが良いでしょう。

さいごに

Railsでの非同期処理とライブラリについて紹介しました。Active Jobは非常に使いやすいので、重たい処理は非同期で処理してユーザビリティを高めていきましょう。

参考

おすすめ書籍

Ruby on Rails 5アプリケーションプログラミング Effective Ruby スラスラわかるHTML&CSSのきほん 第2版 リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Go言語

FSMを使った状態管理をGoで実装する

1 はじめに2 FSMとは3 基本的な実装3.1 実装する状態管理の概要3.2 状態管理を実装する4 structを定義した応用的な実装5 FSMの可視化6 さいごに7 おすすめ書籍 はじめに 一般的 ...

PHPerだけどKotlinを勉強したって良いよね その1〜クラス編〜

1 はじめに2 インターフェース2.1 基本2.2 デフォルト実装付メソッド2.3 同じメソッド名を持つ複数のインターフェース3 修飾子3.1 open3.2 abstract4 可視性修飾子5 さい ...

Go言語

[Go初心者]Interfaceについて学習

1 はじめに2 interfaceとは3 interfaceのメリット3.1 インターフェースを使うとコードの共通化ができる3.2 インターフェースを使うと実装を隠蔽することができる3.3 インターフ ...

laravel logo

Laravelの認可機能Gateを使ってみた

1 はじめに2 やる事3 Gate3.1 登録3.2 利用4 Policy5 ミドルウェアでの使用6 さいごに7 おすすめ書籍 はじめに Laravelには認可機能を簡単に実装出来るGateという機能 ...

Vue.js入門その4〜TODOアプリにサーバーサイドを追加してみる〜

1 はじめに2 準備2.1 今回作成したいもの2.2 環境構築3 サーバーサイド3.1 DB3.2 メモ:rails generateで余分なファイルを生成しない3.3 作成したファイル4 ビューの作 ...

フォロー

blog-page_side_responsive

2018年9月
 1
2345678
9101112131415
16171819202122
23242526272829
30  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。