Horizon とは
Laravel Horizon は、LaravelのRedisキュー専用の監視ダッシュボードです。ジョブのスループット・実行時間・失敗状況をリアルタイムで可視化し、ワーカー設定をコードで管理できます。インストール
Composer でインストールします。config/horizon.php と app/Providers/HorizonServiceProvider.php が生成されます。
設定
config/horizon.php の構成
config/horizon.php はワーカーの設定をすべて管理するファイルです。中心となる設定が environments オプションです。
Horizon は内部で
horizon という名前の Redis 接続を使用します。config/database.php でこの名前を他の接続に使わないでください。CSP nonce(Content Security Policy)
Content Security Policy の一環として Horizon のビュー内で使われるscript / style タグに nonce属性 を設定したい場合は、Horizon::cspNonce メソッドを使います。リクエストごとに新しい nonce を割り当てるため、通常はミドルウェア内で呼び出します。
config/horizon.php の middleware オプションに追加します。
スーパーバイザー(Supervisor)
各環境は1つ以上の「スーパーバイザー」を持てます。スーパーバイザーはワーカーグループの管理単位で、異なるキュー・バランス戦略・プロセス数を持つ複数のスーパーバイザーを同一環境で動かすことができます。デフォルト値
defaults オプションで、すべてのスーパーバイザーに適用されるデフォルト値を設定できます。
メンテナンスモード
アプリケーションがメンテナンスモードのとき、Horizon はデフォルトでジョブを処理しません。強制的に処理させるにはforce オプションを使います。
ジョブの最大試行回数
tries を 0 にすると無制限の再試行を許可します。
ジョブのタイムアウト
バックオフ(再試行の待機時間)
例外発生後に再試行するまでの待機秒数を指定します。その他のワーカーオプション
tries、timeout、backoff 以外にも、各スーパーバイザーはワーカープロセスの挙動や自動再起動のタイミングを制御するオプションを受け付けます。長時間稼働するプロセスを定期的に再起動することは、メモリリークを防ぐ良い習慣です。
memory— 再起動までにワーカープロセスが消費できる最大メモリ量(MB)。デフォルトは128maxJobs— 再起動までに処理するジョブ数。0は無制限を意味する。デフォルトは0maxTime— 再起動までにワーカーが稼働できる秒数。0は時間による再起動なしを意味する。デフォルトは0sleep— ジョブがない場合に次のポーリングまで待機する秒数。デフォルトは3rest— 各ジョブの処理間に一時停止する秒数。デフォルトは0nice— ワーカープロセスの優先度(“niceness”)。値が大きいほど優先度は低くなる。デフォルトは0
バランス戦略
Horizon には3種類のワーカーバランス戦略があります。auto(デフォルト)
auto(デフォルト)
キューの負荷に応じてワーカー数を自動調整します。
minProcesses と maxProcesses で範囲を指定します。time— キューを空にするまでの推定時間でスケーリングsize— キュー内のジョブ数でスケーリング
auto 戦略ではキューの順序が優先度を意味しません。優先度を強制したい場合は複数のスーパーバイザーを使用してください。simple
simple
ワーカー数を固定し、指定したキューに均等に分配します。上記では
default と notifications にそれぞれ5プロセスずつ割り当てられます。false(バランスなし)
false(バランスなし)
キューを列挙した順に厳密に優先します。Laravelデフォルトのキューシステムと同様の動作ですが、積み残しに応じてワーカー数をスケーリングします。
default キューのジョブが常に notifications キューより先に処理されます。ダッシュボードの認可
Horizon のダッシュボードは/horizon ルートでアクセスできます。ローカル環境ではデフォルトで誰でもアクセスできますが、本番環境ではゲート定義でアクセスを制限します。
app/Providers/HorizonServiceProvider.php の gate() メソッドを編集します。
Horizon の起動
基本コマンド
ローカル開発: 自動再起動
ファイル変更を検知してHorizonを自動再起動するにはhorizon:listen コマンドを使います。
Supervisor による常時起動
本番環境では Supervisor を使って Horizon を常時稼働させます。Supervisor のインストール
設定ファイルの作成
/etc/supervisor/conf.d/horizon.conf を作成します。
Supervisor の起動
デプロイ時
コードをデプロイするたびに Horizon を再起動して変更を反映します。autostart=true / autorestart=true になっていれば、終了後に自動で再起動されます。
ジョブの管理
タグ
Horizon はジョブに関連する Eloquent モデルを自動検出してタグを付けます。tags() メソッドを実装します。
tags() メソッドに渡されます。
サイレント化
ダッシュボードの「完了済みジョブ」リストに表示したくないジョブは、config/horizon.php でサイレント化できます。
Silenced インターフェースを実装する方法もあります。
メトリクスとモニタリング
Horizon のメトリクスダッシュボードにはジョブ・キューのスループットと実行時間が表示されます。定期的にスナップショットを取得するためのスケジュールを設定します。config/horizon.php の metrics.trim_snapshots オプションで、メトリクスグラフ用に保持するスナップショット数を設定できます。この設定はスナップショットの経過時間ではなく件数で制限するため、実際の保持期間は horizon:snapshot コマンドの実行頻度によって変わります。
ジョブ失敗の通知
キューの待機時間が長くなったときに通知を受け取ることができます。app/Providers/HorizonServiceProvider.php の boot() メソッドで設定します。
待機時間のしきい値
config/horizon.php の waits オプションで通知トリガーとなる待機秒数を設定します。
0 を設定するとそのキューの通知は無効になります。
失敗ジョブの管理
失敗したジョブは ID または UUID で削除できます。アップグレード
Horizon のメジャーバージョンアップ時はアップグレードガイドを必ず確認してください。関連ページ
キューとジョブ
Laravel キューの基本。ジョブの作成・ディスパッチ・バッチ処理・失敗処理を解説。
Redis
Horizon のバックエンドとして必要な Redis の設定と使い方。