藍綠發佈與每週依賴升級之所以「無聊」,前提是 OpenClaw 閘道能在不截斷半完成工具呼叫的前提下離場。到 2026 年,平台團隊普遍要求 優雅停機 路徑與雲原生語義一致:先翻轉就緒讓負載平衡停止路由新流量,再停止接入迴圈,在明確截止時間內排空在途 HTTP 與串流工具呼叫,最後在指標與日誌刷出後以零離開碼結束行程。本文界定就緒與存活的語義差異,說明如何為長耗時匯出設定有界排空而不致餓死其他租戶,停機如何與 熔斷器 及 死信佇列 協同,如何結合 讀取逾時與掛起診斷 分類慢呼叫,以及 健康監控 應如何把「正在排空」狀態暴露給合成探針。
成本錨點:在專用 Mac mini 上以約 每天 16.9 美元 向 MacHTML 租用環境,預演 SIGTERM 編排,比在真實發佈中讓 launchd 在 三十秒 後升級為 SIGKILL、卻仍有多路工具呼叫佔用資料庫鎖便宜得多。
訊號、launchd ExitTimeout 與系統預設
在 macOS 上,當維運執行 launchctl bootout 或依賴升級觸發工作重啟時,launchd 會向閘道行程送出 SIGTERM。若未提高 ExitTimeout,平台會在固定寬限期後升級為 SIGKILL——許多範本常見為 三十秒,但務必用 launchctl print 核對。Linux 容器的預設視窗不同;混用兩類環境而不做桌面級演練,幾乎必然在首次大流量發佈時翻車。
閘道應安裝訊號處理常式:以原子方式設定 shutting_down 旗標、關閉閒置長連線,並具執行緒安全地啟動排空計時器。避免在訊號處理常式內做重活,把事件遞送回主迴圈,才能保持 TLS 狀態一致。
文件化兩套預算:對外(負載平衡相信的視窗)與對內(工作集真實需要)。若內部預算大於外部預算,要麼延長註銷延遲,要麼在改停機程式前收緊工具逾時。
排空期間的就緒與存活
只要行程仍能推進在途工作,存活 應保持為真;一旦打算拒絕新工作階段,就緒 應立即為假。許多團隊圖省事顛倒二者,導致編排層仍把新工作階段排程到已回傳 503 的主機,放大重試風暴。
提供 /readyz 端點,在排空時回傳 503 與 JSON,例如 {"draining":true,"in_flight":14,"deadline_ms":12000},便於健康堆疊繪製排空曲線。請與 閘道健康監控 的可用性語義對齊。
停止接入迴圈並避免重設風暴
立刻關閉監聽通訊端可能在在途 TLS 交握上觸發 RST。更穩妥的是應用層閘門:對新建連線回傳 503 並附帶 Retry-After: 5,讓既有連線完成目前請求。HTTP/2 的 GOAWAY 需要嚴格順序:先將最大流 advertised 為零,等待開啟流結束,再關閉。
對 WebSocket 工具橋,應在關通訊端前送出應用層 server_shutdown 並提示用戶端退避,避免所有代理同時撲向下一個執行個體。
工作集、單工具截止與串流情境
為排空預算分區:牆鐘時間的 六成 給常規 REST 工具,三成 給長輪詢或串流扇出,一成 給指標抓取等管理鉤子。若單一租戶獨佔工作執行緒,即使在停機階段也要強制每租戶並發上限,以免其他租戶的工具呼叫無法收尾。
模型串流輸出活躍時,應停止接受新輪次,但允許目前伺服器端推送幫浦運行,直到位元組完成或子截止(例如 二十秒)先到。對提前截斷記錄結構化錯誤 SHUTDOWN_TRUNCATED_STREAM,便於產品側調參。
負載平衡鉤子與 Retry-After
就緒翻轉為假後,至少等待一個健康檢查週期——常見 五秒——再停止接入。多區域部署若 DNS 仍指向舊執行個體,應加倍等待。始終輸出一致的 Retry-After,用戶端冪等故事才能對齊。
四層透傳負載平衡下,已建立的 TCP 連線可能在 keep-alive 上複用並排隊新 HTTP 請求。為每連線維護代際計數:停機開始後,對舊通訊端上的新請求回傳 Connection: close,同時仍完成該通訊端上的活動請求。
指標、日誌與停機後稽核
匯出計量 gateway_in_flight_total 供抓取,以及計數 gateway_shutdown_events_total{result},標籤取 clean、deadline_exceeded 或 forced_kill。直方圖 gateway_shutdown_duration_seconds 應涵蓋從就緒翻轉到行程結束的整段,便於儀表板判斷 四十五秒 預算是否週週可行。
結構化日誌應包含在 macOS 側設定的等價「優雅期」、觀測到的 in_flight 峰值與最慢工具名。與發佈工單一併歸檔,迴歸時才能同比。
若七日視窗內 clean 佔比跌破 百分之九十九 且發佈頻率上升,通常意味著工具逾時悄然拉長或某供應商 SDK 忽略上下文取消。
滾動重啟期間的金絲雀權重
滾動重啟會放大停機頻率。若每台執行個體每小時都重啟,再疊加激進的金絲雀切流,fleet 可能永遠達不到穩態。除非合成流量證明餘量,否則併發排空執行個體不宜超過 fleet 的 兩成。
在排空期間若五分鐘 5xx 超過 百分之一 且任一執行個體宣告 draining,應自動把權重表回滾到最近已知良好版本並通知發佈負責人。
熔斷器協同
排空階段需要更少探測而非更多。與 熔斷器 協同:拉長半開間隔,或對已不健康的依賴強制開路,避免在秒針倒數時把工人浪費在注定失敗的上游呼叫上。
死信生產方與冪等入佇
若停機與失敗處理入佇死信競態,必須保證入佇冪等或可去重;否則 TCP 重試後的重複入佇會毒害維運。詳見 死信佇列設計 中能在行程結束後仍有效的信封欄位。
對照:硬殺與優雅排空
| 情境 | 硬 SIGKILL | 優雅排空 |
|---|---|---|
| 在途資料庫交易 | 可能部分提交 | 等待或明確回滾鉤子 |
| 串流模型符記 | 句中截斷 | 有界等待與結構化截斷標記 |
| 發佈耗時 | 更快 | 典型增加五至四十五秒 |
| 維運信任 | 低 | 指標證明排空則高 |
編號上線清單
- 為
/readyz增加排空 JSON 並接入儀表板。 - 將
ExitTimeout與內部排空計算對齊並留 十秒 安全餘量。 - 在至少 五十 路合成工具呼叫持有時整合測試
SIGTERM。 - 用壓測工具驗證 HTTP/2 GOAWAY 順序。
- 事故覆盤範本附帶排空時間線表格。
常見問題
混合機隊上 systemd KillMode 是否影響 OpenClaw?
應書面記錄差異:mixed 與 control-group 決定哪些子行程收到訊號。
能否無限排空?
不能——必須有界;無限排空會掩蓋卡死工人。請用 掛起診斷 分類慢呼叫。
Windows 開發筆電重要嗎?
僅當你們交付 Windows 閘道;多數設計夥伴仍用 MacBook,macOS 演練依然高價值。
優雅停機是可靠性文化與可度量秒數的交會。向 MacHTML 以約 每天 16.9 美元 租用 Mac mini,可獲得原生 macOS 訊號投遞、Apple 晶片 浸泡測試餘量,以及透過 SSH 與遠端桌面觀察 launchd 時間線,在碰觸客戶流量前調好排空預算。
在雲端 Mac mini 上預演 OpenClaw 閘道停機
在真實 macOS 網路堆疊上鏡像生產 ExitTimeout、壓測失敗模式與就緒翻轉,再進行下一次藍綠切換。