ハマログ

株式会社イーツー・インフォの社員ブログ

Laravelのキューイングを実装する

はじめに

Laravel5で、とあるサービスの並行して走る複数のジョブをCommand&タスクスケジューラで実装してしばらく運用していたところ、処理量が増えるにつれてSQLエラーが不定期に頻発するようになりました。
そこで、いままで利用していなかったキューの実装に置き換えたところ、今のところ上手く動いているため、実装をメモしておきます。

Laravelでは、DB, Redis, Amazon SQSなど、様々なキューイングサービスと連携するためのドライバをあらかじめ備えており、設定を変更する程度で、使い分けをおこなうことができます。

今回は、お手軽なところで、データベースを利用してみます。

Quick Start

設定ファイルの変更
.envファイルに、QUEUE_DRIVER=databaseを記載します。データベースの標準テーブル名は、jobsですが、変更の必要がある場合、config/queue.phpで変更できます。
テーブルの作成
artisanでテーブルを作成します。
queue:tableでmigration用のファイルが作成されるので、migrationを実行してテーブルを作成します。
php artisan queue:table
php artisan migrate
ジョブの作成
artisanで、キュー用のジョブクラスを作成します。
以下のコマンドを実行すると、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 コマンドで起動します。
php artisan queue:work
キューを1件だけ処理したり、
php artisan queue:work --once
ジョブの最大実行回数を指定したりすることができます。
php artisan queue:work --tries=10
キューの監視
殆どの場合、キューは非同期で実行されるため、ワーカーの監視が必要となります。

Laravelのマニュアルでは、Supervisorの利用や、Redisを監視するHorizonが紹介されています。

単純な監視の場合は、テーブルのレコード数を定期監視する程度で十分です。
DBJobLaravelMQPHPQueueRDBRedisSQSキュージョブバッチ

  kaneko tomo   2017年11月13日


関連記事

AWS CodeDeployでデプロイ対象のアプリケーションによって処理を制御する

AWS CodeDeployでアプリケーションをデプロイする際に、特定のサーバー…

PHP5.6でカード決済できない

こんにちはいけしまです。もう少しで冬休みですね。早い方はもうお休みでしょうか。 …

AWSのVPCとサブネットの予約済みIPv4アドレスについて

今月より、レガシーなOSで動作しているウェブシステムをAWSに移行する作業をして…


← 前の投稿

次の投稿 →