cover

系統一定會壞,問題是你準備好了沒

一句話總結:生產環境出問題不是意外,是必然。差別在於你是手忙腳亂還是按 SOP 冷靜處理。

結論先講:成熟的工程團隊不是不出事故,是出了事故之後能在 30 分鐘內恢復,然後從每次事故裡讓系統變得更強。

不管你的 code 多嚴謹、測試覆蓋率多高、基礎設施多冗餘——硬碟會壞、網路會斷、第三方服務會掛、人會手滑。這些事情一定會發生

差別在於你是怎麼面對的:

  • 你是使用者打電話來才知道出事了,還是監控系統在影響擴大前就告警了?
  • 你是在 Google 上瘋狂搜尋解法,還是打開 Runbook 按步驟執行?
  • 你是找到那個「犯錯的人」然後罵一頓了事,還是做 Post-mortem 找出系統性問題?

這就是事故管理的意義。不是消除所有故障(不可能),是建立一套流程讓你在面對故障的時候不慌。

事故生命週期:六個階段的閉環

每一次事故都走過這六步:

偵測 → 分級 → 應變 → 解決 → 覆盤 → 預防 → (回到偵測)

最後一步「預防」的輸出會回饋到第一步「偵測」——告警規則更新了、監控更完善了、Runbook 更新了。這樣系統的可靠性才會隨著時間一直上升,而不是同樣的事故反覆發生。

嚴重等級:不是所有事故都要全員集合

你不需要為了一個 UI 小瑕疵在凌晨三點把 CTO 叫起來。明確的嚴重等級讓團隊知道什麼時候該緊張、什麼時候可以明天再處理。

P1 (Critical):核心服務全掛,大量用戶受影響。主資料庫掛了、全站打不開、支付系統全面失敗。15 分鐘內回應,每 15 分鐘更新一次。

P2 (Major):核心功能嚴重降級。API 回應超過 10 秒、部分地區登入不了。30 分鐘內回應。

P3 (Minor):非核心功能異常。推播通知延遲、報表匯出失敗。4 小時內回應。

P4 (Low):不影響服務的小問題。下個工作日處理。

判定等級看四個面向:影響多少用戶、有沒有影響營收、有沒有資料風險、問題會不會隨時間惡化。

On-call:不是懲罰,是專業

On-call 是事故管理的第一道防線。設計不好的 On-call 制度會讓工程師心生怨恨,設計好的則是團隊成熟度的指標。

幾個原則:

  • 一週一輪:避免單次值班太長造成疲勞
  • 至少兩層:Primary 沒回應自動升級到 Secondary
  • 公平補休:週末值班要有對等的補休,不然沒人想排
  • 新人保護期:新進工程師先 shadow 資深工程師 2-4 週才上陣
  • Follow-the-sun:跨時區團隊利用時差,讓每個人只負責自己的工作時段

升級路徑要事先定好:

告警觸發 → On-call Primary(5 分鐘無回應)
         → On-call Secondary(10 分鐘無回應)
         → Team Lead(15 分鐘無回應)
         → VP / CTO

事故指揮官:不是修東西的人

P1 和 P2 事故需要一個事故指揮官(Incident Commander, IC)。IC 的工作不是親自動手修——他是統籌全局的人

IC 做什麼?

  • 宣告事故等級,啟動對應流程
  • 組建應對團隊,找到對的人來處理對的問題
  • 分派任務,避免重複工作
  • 每 15 分鐘向利害關係人更新進展
  • 團隊對修復方案有分歧時做最終決定
  • 確保所有關鍵事件被記錄(Post-mortem 要用)
  • 確認服務恢復後宣告事故結束

IC 通常由資深工程師或 Tech Lead 輪流擔任。小團隊裡 On-call Primary 可以兼任。

事故溝通:透明比完美重要

事故發生時,溝通混亂是讓情況惡化的催化劑。

內部:開專屬事故頻道(#incident-2024-1015-db-outage),所有討論集中在這裡。IC 定期發結構化更新:目前狀況 → 正在做什麼 → 下一步 → 預計恢復時間。

外部:用 Status Page 讓使用者自己查,用 Email 通知企業客戶,在社群媒體發簡短更新。

關鍵是:不知道的時候就說不知道,正在查的時候就說正在查。 使用者最怕的不是出問題,是出了問題你一句話都不說。

這篇的重點回顧

事故管理是一個從偵測到預防的閉環流程。嚴重等級幫你分配資源,On-call 確保有人回應,IC 統籌全局,溝通讓一切透明。

下一篇聊 Runbook——那本讓你凌晨三點不用動腦就能處理事故的操作手冊。

系列文章:

延伸閱讀:

「事故管理不是消防隊的工作,是建築設計師的工作——差別在於你是救火還是防火。」