第36回: キュー・ジョブ入門 — 重い処理を「バックグラウンド」に追い出す

章: 第4章: Laravelフレームワーク

メール送信や画像処理をリクエスト内で動かして、レスポンスが遅くなっていませんか?

ユーザーが「送信」を押してから数秒待たされるのは、UXを大きく損ないます。Laravelのキュー・ジョブを使えば、重い処理をバックグラウンドに追い出し、レスポンスを即時返せます。

キューを使わずに重い処理を同期実行すると何が起きるか

メール送信APIの応答待ちやPDF生成のCPU処理がリクエストをブロックし、タイムアウトやサーバー負荷増大につながります。ジョブクラスに切り出してキューに投入するだけで、これらの問題を構造的に解消できます。

キュー実装の良い例・悪い例

観点 悪い例 良い例
メール送信 コントローラで Mail::send() を同期実行 SendWelcomeMail::dispatch() でキュー投入
失敗対応 失敗しても気づかない $tries / $backoff でリトライ設定
監視 ワーカーのステータス不明 Laravel HorizonでQueue監視
ドライバ sync(デフォルト)のまま本番使用 本番では redis または sqs を使う

チェックポイント: queue:work は一度起動しただけではコードの変更を自動反映しません。デプロイ後は php artisan queue:restart を実行し、ワーカーを再起動しましょう。本番ではSupervisorやLaravel Octaneでワーカーを常時起動させます。

コードサンプル


<?php
// php artisan make:job SendWelcomeMail
class SendWelcomeMail implements ShouldQueue {
    use Dispatchable, Queueable;
    public function __construct(private User $user) {}
    public function handle(): void {
        Mail::to($this->user->email)->send(new WelcomeMail($this->user));
    }
}
// ジョブを投入
SendWelcomeMail::dispatch($user);
// ワーカー起動: php artisan queue:work

まとめ & 次のステップ

  • キューを使うとメール・通知・重い計算処理をバックグラウンドに追い出せます
  • ShouldQueue を実装するだけで既存のジョブをキューに対応させられます
  • 失敗時のリトライ回数とバックオフ時間を $tries / $backoff で設定しましょう
  • 開発時は QUEUE_CONNECTION=sync でキューを使わずに動作確認できます
  • デプロイ後は必ず queue:restart でワーカーを再起動してください

次回は イベントとリスナ を学びます。「何かが起きたら別の処理を動かす」疎結合な設計を整理しましょう。

Related Articles