Laravelのキューイングを実装する
はじめに
Laravel5で、とあるサービスの並行して走る複数のジョブをCommand&タスクスケジューラで実装してしばらく運用していたところ、処理量が増えるにつれてSQLエラーが不定期に頻発するようになりました。
そこで、いままで利用していなかったキューの実装に置き換えたところ、今のところ上手く動いているため、実装をメモしておきます。
Laravelでは、DB, Redis, Amazon SQSなど、様々なキューイングサービスと連携するためのドライバをあらかじめ備えており、設定を変更する程度で、使い分けをおこなうことができます。
今回は、お手軽なところで、データベースを利用してみます。
そこで、いままで利用していなかったキューの実装に置き換えたところ、今のところ上手く動いているため、実装をメモしておきます。
Laravelでは、DB, Redis, Amazon SQSなど、様々なキューイングサービスと連携するためのドライバをあらかじめ備えており、設定を変更する程度で、使い分けをおこなうことができます。
今回は、お手軽なところで、データベースを利用してみます。
Quick Start
設定ファイルの変更
.envファイルに、QUEUE_DRIVER=databaseを記載します。データベースの標準テーブル名は、jobsですが、変更の必要がある場合、config/queue.phpで変更できます。
テーブルの作成
artisanでテーブルを作成します。
queue:tableでmigration用のファイルが作成されるので、migrationを実行してテーブルを作成します。
queue:tableでmigration用のファイルが作成されるので、migrationを実行してテーブルを作成します。
php artisan queue:table php artisan migrate
ジョブの作成
artisanで、キュー用のジョブクラスを作成します。
以下のコマンドを実行すると、app/Jobsにクラスが作成されます。
以下のコマンドを実行すると、app/Jobsにクラスが作成されます。
php artisan make:job SampleJob
作成されたクラス
namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Log; // 追加 class SampleJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { Log::info("execute!"); // 追加 } }
キューの実行
dispatch()メソッドでジョブを起動します。
dispatch(new SampleJob());コンストラクタで値を引き渡すこともできます。
dispatch(new SampleJob($id));dispatchされたジョブは、キューに格納されます。(ここの場合はjobsテーブルにinsertされます)
キューワーカーの起動
キューワーカーを起動すると、キューに格納されたジョブが順次実行されます。
キューワーカーはartisan コマンドで起動します。
キューワーカーはartisan コマンドで起動します。
php artisan queue:workキューを1件だけ処理したり、
php artisan queue:work --onceジョブの最大実行回数を指定したりすることができます。
php artisan queue:work --tries=10
キューの監視
殆どの場合、キューは非同期で実行されるため、ワーカーの監視が必要となります。
Laravelのマニュアルでは、Supervisorの利用や、Redisを監視するHorizonが紹介されています。
単純な監視の場合は、テーブルのレコード数を定期監視する程度で十分です。
Laravelのマニュアルでは、Supervisorの利用や、Redisを監視するHorizonが紹介されています。
単純な監視の場合は、テーブルのレコード数を定期監視する程度で十分です。