Horizon 是什麼
Laravel Horizon 是為 Laravel Redis 佇列專用的監控儀表板。它可即時視覺化 Job 的吞吐量、執行時間、失敗狀況,並以程式碼管理 worker 設定。安裝
透過 Composer 安裝:config/horizon.php 與 app/Providers/HorizonServiceProvider.php。
設定
config/horizon.php 結構
config/horizon.php 集中管理所有 worker 設定,其核心為 environments 選項。
Horizon 內部使用名為
horizon 的 Redis 連線,請不要在 config/database.php 中把此名稱用於其他連線。CSP nonce(Content Security Policy)
若要在 Horizon 視圖中為script / style 標籤加上 Content Security Policy 所需的 nonce 屬性,可以使用 Horizon::cspNonce。因為每次請求都需要新的 nonce,通常會在中介軟體中呼叫。
config/horizon.php 的 middleware 選項。
Supervisor
每個環境可包含一或多個「Supervisor」。Supervisor 是 worker 群組的管理單位,同一環境內可同時執行多個具備不同佇列、平衡策略與程序數的 Supervisor。預設值
透過defaults 選項為所有 Supervisor 設定共同的預設值。
維護模式
應用程式處於維護模式時,Horizon 預設不會處理 Job。若要強制處理,可使用force 選項。
Job 最大重試次數
tries 設為 0 表示允許無限次重試。
Job 逾時
backoff(重試等待時間)
指定拋出例外後至下次重試的等待秒數。其他 worker 選項
除了tries、timeout、backoff,各 Supervisor 還支援控制 worker 程序行為與自動重啟時機的選項。定期重啟長時間執行的程序是防止記憶體洩漏的好習慣。
memory— worker 程序在重啟前可使用的最大記憶體量(MB),預設128maxJobs— 重啟前處理的 Job 數,0代表無限,預設0maxTime— 重啟前可運作的秒數,0代表不以時間重啟,預設0sleep— 沒有 Job 時,下次輪詢前等待的秒數,預設3rest— 每 Job 處理之間暫停的秒數,預設0nice— worker 程序的優先度(“niceness”),值越大優先度越低,預設0
平衡策略
Horizon 提供 3 種 worker 平衡策略。auto(預設)
auto(預設)
依佇列負載自動調整 worker 數,並以
minProcesses 與 maxProcesses 指定範圍。time— 以清空佇列的預估時間進行擴縮size— 依佇列中 Job 數量擴縮
auto 策略下佇列順序並不代表優先度。若要強制優先順序,請使用多個 Supervisor。simple
simple
固定 worker 數,並平均分配給指定的佇列。在上例中會分別配置 5 個 worker 給
default 與 notifications。false(不平衡)
false(不平衡)
嚴格依佇列列表順序優先。行為與 Laravel 預設佇列系統相同,但仍會依積累量調整 worker 數。
default 佇列的 Job 永遠會優先於 notifications。儀表板授權
Horizon 儀表板可透過/horizon 存取。在本機環境預設任何人都可存取,但正式環境中應以 Gate 定義限制存取權限。
編輯 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,關閉後就會自動重啟。
Job 管理
標籤
Horizon 會自動偵測 Job 相關的 Eloquent 模型並加上標籤。tags() 方法。
tags()。
靜音化
不希望顯示於儀表板「已完成 Job」清單的 Job,可在config/horizon.php 靜音化。
Silenced 介面達成。
指標與監控
Horizon 的指標儀表板會顯示 Job / 佇列的吞吐量與執行時間。請安排定期擷取快照。config/horizon.php 的 metrics.trim_snapshots 設定為指標圖表保留的快照數量。此設定以「數量」而非「時間」限制,因此實際保留期間會隨 horizon:snapshot 執行頻率變動。
Job 失敗通知
當佇列等待時間過長時可以收到通知。請在app/Providers/HorizonServiceProvider.php 的 boot() 中設定。
等待時間的閾值
在config/horizon.php 的 waits 中設定觸發通知的等待秒數。
0 表示停用該佇列的通知。
失敗 Job 管理
失敗的 Job 可以用 ID 或 UUID 刪除。升級
進行 Horizon 主版本升級時,請務必參閱升級指南。相關頁面
佇列與 Job
Laravel 佇列的基礎。說明 Job 的建立、派發、批次處理與失敗處理。
Redis
作為 Horizon 後端所需的 Redis 設定與用法。