supervisorとLaravelのQueueを使ってみた


はじめに

CYBIRDエンジニア Advent Calendar 7日目担当の @kenta_kitagawa です。
サーバサイドの業務を担当しています。

6日目は @cy_ssssさんによる「Unityにまつわる入社前後の変化」でした。
入社した頃の初心を思い出します。

今回の最終目標

弊社はマスターデータ投入の際に事前検証用のdatabaseを毎回作り、検証作業が終わったら検証用databaseを削除する運用をしています。
上記の処理に時間が掛かるので、トリガーはGUIからの操作で、削除処理はバックグラウンドで行えるようにして複数のデータベースを削除する手間を省きます。

そこで

php artisan database:drop {database_name} 

上記コマンドをviewから実行し、バックグラウンドで処理できるようにします。
databaseクラスはCommandクラスを継承して実装してます。

やること

・Laravelのキューを使う
・LaravelのキューはDatabaseを使って実装
・supervisorのインストールと設定
・supervisorでキューワーカーを起動
・Controllerからコマンドを実行

環境

・Vagrant 2.2.16
・VirtualBox 6.1.22 r144080
・CentOS Linux release 7.3.1611

導入手順(view、Controllerの導入、実装は割愛)

仮想環境に入ってsupervisorのインストール
vagrant ssh
sudo yum install supervisor
confファイルを作成
sudo vi /etc/supervisord.d/laravel-worker.conf
/etc/supervisord.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d

# artisanがある階層
command=php /home/hoge/artisan queue:work

# ログを吐く階層とファイル名
stdout_logfile=/home/hoge/worker.log

# commandを実行するユーザ
user=hoge

autostart=true
autorestart=true
numprocs=1
redirect_stderr=true
stopwaitsecs=3600
laravel-worker.confを読み込む設定
sudo vi /etc/supervisord.conf
/etc/supervisord.conf
# 一番下の [include] の部分を変更
files = supervisord.d/*.conf
supervisorの起動
sudo service supervisord start

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
jobsテーブルの作成
php artisan queue:table
php artisan migrate
.envファイルに追記
QUEUE_DRIVER=database
Controllerの任意のところに下記を記述
$params = [
    'database_name' => $database_name
];

// jobs にレコード挿入
Artisan::queue('database:drop', $params)->onConnection('database');

jobsテーブルにレコードがあるとキューワーカーが自動で処理を実行してくれます。

さいごに

今まで手動で何度もコマンドを叩いていたものをキューを使うことによって一度にたくさん実行してもバックグラウンドでキューワーカが自動で処理してくれるようになりました。

明日のCYBIRDエンジニア Advent Calendar 2021 8日目は、 @yuki_utsumi さんによる「数十TBのデータをGoogleドライブにアップしよう」です。
どんな内容なのかとても気になります!

ありがとうございました!