2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel Horizon:プロフェッショナルなスケーリング戦略

Posted at

はじめに

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 アルゴリズム解析
2
1
0

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
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?