はじめに
Laravel アプリケーションが大規模化すると、メール送信・大量データのインポート・画像処理・非同期タスク・AI パイプラインなど、バックグラウンドジョブを高速かつ安定的に処理する必要があります。
Laravel 標準の Queue Worker(queue:work, Supervisor)でも運用できますが、
- ジョブの可視化が不十分
- ワーカー数の調整が手動
- 混雑時のボトルネックが発生しやすい
- ジョブの優先度管理が難しい
- 障害時のトラブルシュートが困難
といった課題があります。
これらの問題を解決するのが Laravel Horizon です。
I. Laravel Horizon とは?
Horizon は Laravel 公式が提供する Redis Queue 専用のモニタリング & マネジメントツール で、以下のような強力な機能を提供します。
- リアルタイムダッシュボード
- ジョブの履歴・失敗ログの可視化
- 自動ロードバランシング(Auto-Balance)
- キューの優先度制御
- 複数環境でのワーカー設定
- Supervisor の代替として動作
結論:
Redis Queue を使うなら Horizon は最適解。
II. Horizon を使うべきタイミング
| シナリオ | Horizon を使うべき? |
|---|---|
| 小規模アプリ、ジョブ数が少ない | △ 必須ではない |
| 中・大規模ジョブを大量に処理 | ◎ 必須級 |
| キューの可視化・監視が必要 | ◎ 強く推奨 |
| ジョブの優先度管理が必要 | ◎ 非常に有効 |
| 自動スケールが必要(Auto Balance) | ◎ 必須 |
| Database Queue を使用中 | ✘ 対応していない |
III. インストール方法
1 インストール
composer require laravel/horizon
2 設定ファイルを publish
php artisan horizon:install
php artisan migrate
3 Horizon を起動
php artisan horizon
ダッシュボード
/horizon
VI. Horizon の環境別設定(config/horizon.php)
Horizon は環境ごとに Supervisor を定義できます。
'environments' => [
'production' => [
'supervisor-high' => [
'connection' => 'redis',
'queue' => ['high'],
'balance' => 'auto',
'minProcesses' => 3,
'maxProcesses' => 20,
],
'supervisor-low' => [
'connection' => 'redis',
'queue' => ['default', 'low'],
'balance' => 'simple',
'minProcesses' => 1,
'maxProcesses' => 5,
],
],
],
V. Balance モードの違い
simple
固定のワーカー数で運用する。
用途: ジョブ量が安定している場合。
auto(最も推奨)
ジョブ量を計測し、キューごとにワーカー数を最適化。
用途: 大規模アプリ、突発的にジョブが増える環境。
false
バランスなし(各キュー1ワーカー)。
VI. キューの階層化(優先度制御)
問題:
Heavy job(レポート生成 / インポート / AI 処理)が default キューを占有し、
軽量ジョブ(メール送信・通知)が遅延する。
解決: Horizon による階層化
high = メール・通知
medium = 注文処理
low = 重いバッチ、インポート
例:
'priority' => [
'queue' => ['high', 'medium', 'low'],
'balance' => 'auto',
'minProcesses' => 3,
'maxProcesses' => 30,
],
→ High → Medium → Low の順に確実に処理される。
VII. Load Test と Horizon の効果
1 万件の Job を投入:
dispatch(function () {
sleep(1);
})->onQueue('medium');
Horizon では以下がリアルタイム可視化:
- throughput(毎秒処理数)
- 遅延時間(Latency)
- ピーク時の状態
- ワーカーの自動調整
- メモリ使用量
一般的な比較結果:
Queue Worker 単体:
→ ワーカー固定でキューが詰まりやすい
Horizon Auto-Balance:
→ throughput が 30〜60% 改善
VIII. Auto-Balance が優秀な理由
Before(固定ワーカー)
high: 5
low: 5
After(Auto Balance)
high: 2
low: 8
→ 負荷に応じてワーカーを最適化。
→ キュー詰まりが劇的に減る。
IX. Supervisor + queue:work との比較
| 項目 | Supervisor + queue:work | Laravel Horizon |
|---|---|---|
| モニタリング | ✘ 手動 | ◎ リアルタイム |
| ジョブ履歴 | ✘ 無し | ◎ 7 日分保持 |
| Auto-Balance | ✘ 無し | ◎ あり |
| 優先度制御 | △ 自力実装 | ◎ 標準対応 |
| ワーカー設定 | 手動・再起動要 | 自動調整・再起動不要 |
| 障害調査 | 困難 | 容易 |
| DevOps コスト | 高い | 低い |
総評:Horizon は完全上位互換。
X. よくあるミスとベストプラクティス
❌ 全ての Job を default キューに詰め込む
→ 最大のキュー詰まり要因
✔ キューを階層化する
❌ simple モード常用
✔ 大規模なら auto 必須
❌ Database Queue と併用
✔ Horizon は Redis 専用
❌ timeout を設定しない
✔ Job ごとに timeout を明確化
❌ ワーカー数が少なすぎる
✔ min/max の幅を広げる
XI. 実戦レベルの Best Practices
✔ ドメインごとにキューを分割
mail
billing
ai-processing
heavy-batch
notifications
report-export
✔ Auto Balance + 高い maxProcesses
'minProcesses' => 3,
'maxProcesses' => 50,
✔ Slack アラートで失敗ジョブを即検知
Log::channel('slack')->error($exception->getMessage());
✔ 本番環境では Redis Cluster / ElastiCache を推奨
XII. まとめ
Laravel Horizon は単なる「キュー監視ツール」ではなく、
キュー処理の最適化・モニタリング・スケーリングを一元管理する
“Queue Orchestrator” です。
特に以下のような環境にはほぼ必須:
- 大量ジョブを処理するシステム
- 優先度の異なるジョブが混在
- 高スループットの API
- 大規模 SaaS
Supervisor + queue:work を使い続ける理由はほぼありません。
Redis Queue + Horizon が Laravel のベストプラクティスです。
参考資料
- Laravel Horizon 公式ドキュメント
- Laravel Queue ドキュメント
- Redis (In-Memory Data Store)
- Laracasts: Horizon Deep Dive
- Laravel コミュニティによる Queue Best Practices
- Supervisor vs Horizon の比較記事
- Horizon Auto-Balance アルゴリズム解析