LoginSignup
7

More than 1 year has passed since last update.

posted at

updated at

【Laravel】キューを使う上で知っておきたいこと

参考

キュー 6.x Laravel
https://readouble.com/laravel/6.x/ja/queues.html

ワーカの起動方法

workとlistenの2種類がある。

queue:work

キューワーカは長時間起動するプロセスで、メモリ上にアプリケーション起動時の状態を保存していることを記憶にとどめてください。そのため、開発段階ではキューワーカの再起動を確実に実行してください。付け加えて、アプリケーションにより生成、もしくは変更された静的な状態は、ジョブ間で自動的にリセットされないことも覚えておきましょう。

デーモンキューワーカは各ジョブを処理する前に、フレームワークを「再起動」しません。そのため、各ジョブが終了したら、大きなリソースを開放してください。たとえば、GDライブラリでイメージ処理を行ったら、終了前にimagedestroyにより、メモリを開放してください。

キューワーカは長時間起動プロセスであるため、リスタートしない限りコードの変更を反映しません。ですから、キューワーカを使用しているアプリケーションをデプロイする一番シンプルな方法は、デプロイ処理の間、ワーカをリスタートすることです。queue:restartコマンドを実行することで、全ワーカを穏やかに再起動できます。

通常のワーカを立ち上げる。
queue:listenと違いフレームワークを再起動しないため、デプロイ後はワーカを再起動しない限り、古いコードが動き続けてしまう。
また、完全にメモリを開放しないため、コードの内容によってはメモリリークが発生する可能性がある。
ワーカ再起動にはqueue:restartを使う。
これはgraceful restartであり、ワーカは既存のジョブが完了したタイミングで再起動される。

queue:listen

queue:listenコマンドを使えば更新したコードをリロード、もしくはアプリケーションの状態をリセットしたい場合に、手動でワーカをリスタートする必要がなくなります。しかし、このコマンドはqueue:workほど効率はよくありません。

1ジョブごとにフレームワークを再起動するワーカを立ち上げる。
ジョブごとにメモリが開放され、コードが再読み込みされるため安心。
ただし、オーバーヘッドが大きい。

ワーカの終了方法

デフォルト

queue:work Artisanコマンドを使いワーカを実行できます。queue:workコマンドが起動したら、皆さんが停止するか、ターミナルを閉じるまで実行し続けることに注意してください。

ジョブが無くてもワーカは動き続ける。
例) php artisan queue:work

once

--onceオプションは、ワーカにキュー中のジョブをひとつだけ処理するように指示します。

1つのジョブを実行した後にワーカを終了する。
例) php artisan queue:work --once

stop-when-empty

--stop-when-emptyオプションは、すべてのジョブを処理してから終了するように、ワーカへ指示するために使用します。

全てのジョブを実行した後にワーカを終了する。
例) php artisan queue:work --stop-when-empty

ジョブの排他制御方法

Cron タスクスケジューラの onOneServer() と withoutOverlapping() の違い を読む

MaxAttemptsExceededExceptionとの接し方

MaxAttemptsExceededExceptionと戦って気付いたこと を読む

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7