Laravel+supervisorでQueue

どうもこんにちは

メール送信処理を非同期的に送信したかったので、
LaravelのQueueと、プロセス監視にSupervisorを使いました。
ま、先人たちがすでにさんざんやっておられる、アレです。

それぞれにわかりやすく執筆されている方はいらっしゃいますが
両方をまとめて1記事にされているものが少なかったので、備忘録をかねて。

Laravelのバージョンは5.8、EC2にSupervisorをインストールして動作させてみます。

では、参りましょう。

Supervisor本家サイトはこちら ⇒ Supervisor: A Process Control System — Supervisor 4.0.3 documentation


Laravelのあれこれ
.envファイル

今回はデータベースドライバを使いました。
EC2だったらSQSを使えばいいんじゃねーのっていう声は聞こえません。

.envファイルを編集します。

 

config/queue.phpについては、特に触りませんでした。

Migrate

キュー管理用テーブルのmigrateです。
公式がきちんと用意してくれています。ありがたや。
キュー処理が失敗した時用のテーブルも一緒に作ります。

メール送信処理

メール送信処理をすこーし変えます。
今回はメールファサードで送っているので、Mail::sendをMail::queueに変えて回るだけです。

にしました。

実際に動かすと、jobsテーブルにレコードが追加されます。
※キューワーカーを起動していないと、たまる一方なのは当たり前。

補足

今回はメール送信処理なので、
php artisan make:mail MyMailSender
で作ったメール送信クラスを使っています。
メール送信でない処理は
php artisan make:job MyJobProcessor
のようにJobクラスを作って、

でキューに放り込むようです。
dispatchメソッドの引数はMyJocProcessorのコンストラクタの引数だそうです。へー


Supervisor

SupervisorをEC2にインストールしてみます。

環境

念のため、ですが
こんな環境です。

 

インストール

公式ドキュメントによると、
$ pip install supervisor
らしいのですが、
$ easy_install supervisor
で入れてしまいました。
ま、いいか。

設定ファイル作成と編集 その1

設定ファイルのひな形があるので、それをもとに/etc/supervisord.conf を作ります。
# echo_supervisord_conf > /etc/supervisord.conf

#$ sudo ~~~~だとなぜかpermission deniedになったので、
rootにスイッチしてからやりました。

あとは、ファイルを編集します。
いろいろ端折りますが、編集したのはこれくらいです。

[include]の前のコメントを外すのをお忘れなく。(それで数時間はまりました。。。)

設定ファイル作成と編集 その2

laravelのキューワーカ用設定ファイルを作ります。
/etc/supervisord/conf.d/laravel-worker.confを下のように作りました。

commandのところが、laravelのキューコマンドです。
オプションは、公式ドキュメントを参考に、適宜与えました。

サービス登録

せっかくなので、サービスに登録しておきます。
スクリプトがこちらで公開されていたので
ありがたく使わせていただきました。

/etc/init.d/supervisordファイルに、スクリプトを記載します。

パーミッションの変更をお忘れなく。

# chmod 755 /etc/init.d/supervisord

あとは、サービス登録ですね。

# chkconfig supervisord on

起動とか

ここまでしておくと、serviceコマンドから起動できます。
起動
# service supervisord start
終了
# service supervisord stop
再起動
# service supervisord restart

起動すると、

こんな感じで、キューワーカが起動します。


最後に

Supervisorから出力されるログをローテーションする設定は入れとかないと、ですね。

キューの仕掛けまで用意しているとは、モダンなフレームワーク、恐るべし。

r.tanakaがお届けしました。

コメントを残す

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