Laravel には、FIFO(先出先入)でキューを投入し、登録した順にジョブを起動する仕組みがある。
この記事では、ジョブを直列(前の処理が終了するまで次の処理を起動しない)で動かす方法を紹介する。
スポンサーリンク
はじめに
ジョブ名::dispatch
でジョブを起動する際にキュー名を指定しないと、default
キュー上でジョブが起動される。そして default
キューで動くジョブは次のイメージのように前のジョブの終了を待たずに、キューが登録されると次々とジョブが並列で起動される。
ジョブによっては、並列で処理が動いては困るものもあるだろう。
そのような場合、キューの名前を指定してジョブを起動することで、下のイメージのように処理を直列(シーケンシャル)で動かすことが可能である。
スポンサーリンク
キューの名前を指定してジョブを起動
それでは、キューの名前を指定してジョブを動かす方法を見てみよう。
コントローラー側(キューを登録する側)
まず、キューを登録するコントローラー側のコードを書く。
次のコードは、HogeJob
を myQueue
キュー上で動かす場合のサンプルコードである。
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で、前のジョブが終了するまで、次のジョブが起動しないように制御する方法を紹介してきた。
同時実行によるリソースの競合などの不具合は、原因の特定が難しくなりがちになるので、基本的にはキュー名を指定して、極力シーケンシャルにジョブを動かしたいところである。
0 件のコメント:
コメントを投稿