LaravelのJOBとQUEUEを使用して非同期処理を実装してみた。

こんにちは。遠藤です。

今回はLaravelのJOBとQUEUEを使用して非同期処理を実装してみたので、つまずいた点にも触れながら実装方法について解説させていただきます。

ちなみに今回実装した非同期処理は以下のようなものです。

A:新規会員入会 → B:会員登録処理実施( → C:非同期で関連する会員のDB情報更新) → 処理終了

Cの処理が重い処理だったため、非同期での実装を試みました。

  1. JOBとQUEUEについて
  2. .envの設定
  3. DBにQUEUE用のテーブルを作成
  4. JOBクラスの作成
  5. QUEUEへ格納
  6. WorkerによるJOBの実行
  7. SupervisorによるWorkerの管理

JOBとQUEUEについて

LaravelにおいてJOBとは処理そのもののことです。例えば、会員管理システムにおいて会員のDB情報を更新するする処理のことをJOBと呼びます。

LaravelにおいてQUEUEとはJOBをため込む箱のようなものです。最初に箱に入ったJOBから順番に処理していく仕組みです。このQUEUEを使用することでJOBを非同期で実行することができます。QUEUEはデータベース等を用いて用意します。今回はデータベースをQUEUEとして使用したのでその方法を紹介します。

.envの設定

.envファイルのQUEUE_CONNECTION変数の設定を以下に変更します。

最初この設定を忘れており、デフォルトの以下の設定になっていました。

syncになっているとデータベースに格納されません。そのため非同期実行ではなく同期実行となってしまいます。

また、.envファイルのQUEUE_DRIVER変数の設定も追加します。

以上で.envの設定は終了です。

※ データベース接続設定はできている前提です。

DBにQUEUE用のテーブルを作成

JOBをため込むためのテーブルを作成します。

テーブルは以下のartisanコマンドを使用することで自動で作成できます。

以下はマイグレーションファイルの中身です。

migrationを使っていないという方は以下のSQLをご使用ください。

JOBクラスの作成

JOBクラスをapp/jobsに作成したます。

以下のartisanコマンドで自動作成できます。

php artisan make:job UpdateMemberInfoJob

以下app/jobs/UpdateMemberInfoJob.phpの中身です。

handleの中に処理を記述していきます。

QUEUEへ格納

JOBクラスができたら、dispatchメソッドを呼び出すことで、QUEUEへJOBを格納します。

JOBは非同期実行されるため、処理Aの後、すぐに処理Bが実行されます。

WorkerによるJOBの実行

上記でQUEUEにため込んだJOBを実行するのがWokerです。

entryメソッドが実行されるたびに、QUEUE(jobsテーブル)にJOBがたまっていきます。

以下のコマンドにより、Workerを起動させることでJOBが実行されます。

control +  – 等で抜けるまで順次JOBを処理し続けます。

SupervisorによるWorkerの管理

QUEUEにたまったJOBをすぐに処理したい。と思っていましたが、上記の方法でのWorker起動ですとリリース時にコマンドを実行しておいたもののWEBサーバーの再起動等の何らかの理由でWorkerが終了してしまった場合、QUEUEにたまったJOBが処理されないという問題が発生してしまいます。そこでlinuxのSupervisorを使用することでコマンドを管理することにしました。

numprocsを1に設定することで1つずつ処理が実行されるようになります。



❏❏ TOPIC ❏❏ ------------------------------------------------------------

カスタム自由!フリーECサイトパッケージ
チャットボット導入サービス
WEBシステム開発・スマホアプリ開発はSRIAへ