Gateway 啟動先別急著重開
我現在遇到 Gateway 啟動突然變慢,第一個動作不是重開,也不是先把所有 plugin 關掉,而是把啟動問題當成 production incident 來量測。尤其是 Windows 或混合節點環境,某個 plugin 卡住 event loop 時,表面上只是 ready 慢,實際上可能連 model runtime publication、health check 和遠端 node handshake 都一起排隊。
我會先記三個數字:HTTP 開始 listening 到 ready 的秒數、event-loop delay p99、以及啟動期間的 event-loop utilization。如果 p99 已經接近數十秒,utilization 長時間維持 1,這就不是網路慢,而是某段初始化工作把主執行緒堵住。這種狀態下盲目增加 client timeout,只會把故障延後,並沒有降低風險。
排查時我會建立最小可啟動組態。先保留核心 agent 和管理介面,逐一停用 sidecar、外部服務整合,再一次只開一個 plugin。每次都記錄同樣的三個數字,並保留啟動 log。不要一次關十個,否則最後只知道「關掉就好了」,卻不知道是哪個整合造成回歸。staging 可以用 systemd override 或獨立 config directory 做這件事,production 則要先複製整份設定與 state,避免救火時改到正式節點。
我特別會把 Slack 這類需要啟動連線、載入 workspace 資料的整合,跟搜尋或通知服務分開測。單一整合恢復後若啟動時間從 30 秒跳到 3 分鐘,根因範圍其實已經縮得很小了。接著再檢查 Node.js 版本、plugin 版本、DNS、proxy、TLS handshake,以及是否有同步初始化或大量 retry。Linux 上還會看 journalctl 的時間戳和 CPU、RSS;ARM64 節點則多加看磁碟 I/O,因為低功耗機器的初始化瓶頸常常被誤認成網路問題。
還有一個 production 很容易踩的坑:降版不等於把 binary 換回去。state database schema 可能已經被新版本升級,舊版即使能啟動,也可能讀不了資料。我的做法是先做可驗證的備份,記錄目前版本和 schema,再用隔離的 state path 測試舊版;確認能讀取、能回復、能重新註冊 node 之後,才安排維護窗口切換。備份只存在資料夾裡不算完成,至少要抽樣 restore 一次。
重點是,plugin 啟動異常要有明確的 rollback 邊界:核心 Gateway 能獨立 ready、監控能看見 event-loop delay、資料庫能安全回復。達不到這三點,就先維持最小組態,不要為了「功能全開」讓整個控制面在每次重啟時卡死。
作者:Bo-Han Chen