Laravelのキューでジョブを直列で動かす!

2022年7月9日土曜日

Laravel PHP

t f B! P L

Laravel には、FIFO(先出先入)でキューを投入し、登録した順にジョブを起動する仕組みがある。
この記事では、ジョブを直列(前の処理が終了するまで次の処理を起動しない)で動かす方法を紹介する。

スポンサーリンク

はじめに

ジョブ名::dispatch でジョブを起動する際にキュー名を指定しないと、default キュー上でジョブが起動される。そして default キューで動くジョブは次のイメージのように前のジョブの終了を待たずに、キューが登録されると次々とジョブが並列で起動される。

enter image description here

ジョブによっては、並列で処理が動いては困るものもあるだろう。

そのような場合、キューの名前を指定してジョブを起動することで、下のイメージのように処理を直列(シーケンシャル)で動かすことが可能である。

enter image description here

スポンサーリンク

キューの名前を指定してジョブを起動

それでは、キューの名前を指定してジョブを動かす方法を見てみよう。

コントローラー側(キューを登録する側)

まず、キューを登録するコントローラー側のコードを書く。

次のコードは、HogeJobmyQueue キュー上で動かす場合のサンプルコードである。

HogeJob::dispatch()->onQueue('myQueue');

ジョブ側

ジョブ側は、キューの指定有無に関係なく、実装方法は変わらない。

class HogeJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
    public function __construct()
    {
    }

    public function handle()
    {
        Log::info("HogeJobが起動しました。");
    }
}

ワーカーの起動

キューワーカーを起動する際に、--queue オプションに監視するキューの名前を指定する。上のサンプルコードでは myQueue というキューの名前でジョブを起動するようにしたので、--queue オプションに myQueue を指定する。

php artisan queue:work --queue=myQueue

まとめ

Laravelで、前のジョブが終了するまで、次のジョブが起動しないように制御する方法を紹介してきた。

同時実行によるリソースの競合などの不具合は、原因の特定が難しくなりがちになるので、基本的にはキュー名を指定して、極力シーケンシャルにジョブを動かしたいところである。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ