跳至主要內容
PCA 雲端架構師之旅 — 第 4/13 篇

PCA 雲端架構師之旅 04 — 定義 SLO 與 SLI

內文字級

PCA 雲端架構師之旅 04 — 定義 SLO 與 SLI
更新:2026-10-12

提案裡寫「系統可用性 99.99%」很容易,但這個數字要怎麼量?是首頁能打開、結帳能完成,還是 API 沒回 5xx?若量測對象沒說清楚,目標就很難拿來判斷架構是否夠用。

這一步會把上一篇的 User Story 轉成實際觀測的指標(SLI),再訂出目標值(SLO)。目標訂得越嚴格,通常需要更多備援與維運投入,得和業務需求一起討論。

這是 PCA 雲端架構師之旅 的第四步。上一篇 03 · User Stories。

SLI 實際量測服務、SLO 設定 99.9% 目標與 error budget、SLA 對外形成合約承諾的關係圖

圖解:SLI 是速度表,告訴你服務實際表現;SLO 是團隊想守住的目標,沒達標的容許量就是 error budget;SLA 才是對客戶寫進合約、違反後可能要賠償的承諾,通常會比內部 SLO 寬鬆。


先把三個長很像的縮寫分清楚

SLI、SLO、SLA 名字很像,先用「量測、目標、合約」分清楚:

名詞全名意思範例
SLIService Level Indicator實際量測的指標P95 首頁回應時間
SLOService Level Objective對自己的承諾P95 < 1.5 秒、成功率 > 99.9%
SLAService Level Agreement對客戶的合約違反賠 X 元、通常寬鬆於 SLO
Error Budget誤差預算目標範圍內可容許的失敗量30 天、時間型 99.9% 約 43.2 分鐘

表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

把三者串起來看:SLI 是實際量到的表現,SLO 是團隊想達到的目標,SLA 則是對客戶的合約承諾。通常會把內部 SLO 訂得比對外 SLA 更嚴,留下處理波動的空間;量到的 SLI 再拿來檢查是否達標。

先對客戶承諾 SLA,事後才定義 SLI 和 SLO,會讓團隊連目前是否達標都說不清楚。比較穩妥的順序是先決定怎麼量、掌握現況,再討論對外承諾。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

flowchart TB
  U[使用者旅程] --> I[定義 SLI<br/>量什麼、在哪裡量]
  I --> B[量出基準線]
  B --> O[訂 SLO 與 error budget]
  O --> P[建立告警與處置政策]
  P --> A[設定較寬鬆的 SLA]
  A --> R[持續用實際 SLI 回饋調整]
  R --> O
先能量、再訂內部目標與處置規則,最後才承諾 SLA;順序倒過來,就會在不知道現況時先背上合約風險。

可用性目標提高,設計也要跟著檢查

若用 30 天、以時間計算可用性的 SLO,換算成可容許的中斷時間會是:

  • 99.9%(三個 9)= 每月可以掛 43.2 分鐘
  • 99.99%(四個 9)= 每月只剩 4.3 分鐘
  • 99.999%(五個 9)= 每月 26 秒

每月只容許約 26 秒中斷,人工收到告警後再處理通常來不及。若真的需要五個 9,就要檢查故障能否自動偵測與切換,以及資料層、網路和相依服務是否還有單點。Multi-region active-active 是可能的做法之一,但不是單看目標數字就能決定的架構。

可用性目標越高,通常越需要處理備援、故障切換和相依服務;成本不會照「多一個 9」的比例增加。當需求提出五個 9 時,先確認停機會造成什麼損失、現況最常壞在哪裡,再估算改善方案的成本。

📝 考場提點

遇到很高的可用性要求,先問目標量的是什麼、目前 SLI 表現如何,以及可容忍多少失敗。這些資料能幫你判斷要改善哪個故障點,再決定是否需要跨區域部署;直接增加區域與備援,不一定能處理真正的瓶頸。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

flowchart TB
  R[有人要求四個或五個 9] --> M{目前 SLI 已量測?}
  M -- 否 --> B[先建立基準與故障分布]
  M -- 是 --> I{業務損失大於<br/>新增可靠度成本?}
  B --> I
  I -- 否 --> N[協商較合理的 SLO]
  I -- 是 --> G[找出最主要單點與失敗模式]
  G --> U[針對故障模式調整備援<br/>與切換]
  U --> V[驗證 SLI 是否達標]
  V --> I
高可用不是先堆 region;先量現況、算業務損失,再針對主要故障模式逐步投資並驗證成效。

SLI 要量什麼:四個面向

可以從這四類指標找出真正影響使用者的失敗;不必每個故事都湊滿四項:

  • 可用性(Availability) — 成功的請求佔總請求多少。
  • 延遲(Latency) — P50 / P95 / P99 回應時間。注意是看分位數,不是看平均;平均會被大量的快請求拉得很好看,把真正卡住的那批使用者藏起來。
  • 吞吐(Throughput) — QPS、MBps,批次處理量。
  • 正確性(Correctness) — 回傳的資料對不對。這個最容易被忘記,但對金流、帳務類服務反而是最致命的——服務「有回應」不代表「回對」。

延遲只看平均值,可能藏住少數很慢的請求。假設多數請求在 50ms 完成,少數卻等了 8 秒,平均值仍可能看起來不差;P95、P99 能補上尾端體驗。實際要追哪個百分位,得看流量、使用者任務與慢請求的代價。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

flowchart TB
  O[使用者期待的成果] --> Q{最怕哪種失敗?}
  Q --> A[請求沒有成功<br/>Availability]
  Q --> L[回應太慢<br/>Latency<br/>P95/P99]
  Q --> T[工作來不及完成<br/>Throughput]
  Q --> C[結果錯誤<br/>或資料不一致<br/>Correctness]
  A --> M[定義量測邊界與好事件]
  L --> M
  T --> M
  C --> M
  M --> S[用實際資料訂 SLO]
SLI 從使用者最在意的失敗結果出發;選好類型後還要明確定義量測邊界,不能只寫一個漂亮百分比。
Cloud Monitoring 建立 SLO 精靈的設定 SLI 步驟,服務為 App Engine default,選取指標有可用性、延遲、其他(進階)三個 radio,下方評估方法在「以要求為依據」與「以時間範圍為依據」之間選了以要求為依據

上面剛講的四個面向,在 Cloud Monitoring 裡就長這樣:選取指標那排(可用性、延遲、其他)決定你「量什麼」;前面的吞吐與正確性沒有現成選項,要走「其他(進階)」自訂指標。真正的暗坑是下半那組常被略過的「以要求為依據 vs 以時間範圍為依據」——前者是拿好請求數除以總請求數,後者是把時間切成一格一格、數有多少格達標。同樣訂 99.9%,兩種算法燒 error budget 的速度可能差很多,遇到這兩個詞,先認清講的是哪一種再往下算。


訂 SLO 之前,先問自己幾個問題

訂 SLO 前,先把量測邊界和未達標的處理方式談清楚;下面幾個問題若還答不上來,數字也很難用來做決策:

  • 怎麼量? 從 load balancer 的 log 算?前端塞 RUM(real user monitoring,真實使用者監控)抓瀏覽器端的數字?還是看後端 trace?量的位置不同,數字差很多。
  • 量到哪為止? 是從使用者瀏覽器一路到後端 API 的全程,還是只算 API 進來到 DB 出去那一段?邊界沒講清楚,SLO 就是各說各話。
  • 目標要多高? 內部報表與結帳流程的失敗代價不同,先和使用者確認可接受範圍。
  • 沒達標怎麼處理? 先約定告警、事故檢討與發版調整的條件,讓 SLO 能影響實際決策。
  • 誰負責? 指定維護量測與回應問題的團隊,避免指標沒有人追蹤。

Error budget(誤差預算)是目標範圍內可容許的失敗量:99.9% 留下 0.1%。若 SLI 依時間計算,30 天約是 43.2 分鐘;若依請求計算,預算則是可失敗的請求數,不能直接換成停機分鐘。

Cloud Monitoring 建立 SLO 精靈的設定 SLO 步驟,評估時間範圍為滾動 28 天、效能目標填 99.9%,右側預覽圖刻度從 100% 到 90%、圖上出現一條紅色 99.9% 目標線

畫面把目標設為 99.9%,評估範圍則是滾動 28 天,不是月曆月。每天重新計算時,前 28 天內的失敗仍會留在視窗裡;估算 error budget 前,要先看清楚使用的是哪種時間範圍與 SLI 算法。

Error budget 可以幫團隊決定發版節奏:餘額充足時維持正常發布;接近用完時,先處理可靠性問題,再評估非必要變更。最好把門檻寫進發版流程,讓討論有共同依據。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

flowchart LR
  S[持續計算 SLI] --> B{Error budget 狀態}
  B -- 充足 --> F[正常發版與功能實驗]
  B -- 快耗盡 --> C[提高審查門檻<br/>減少高風險變更]
  B -- 已耗盡 --> Z[凍結非必要發版<br/>優先修可靠度]
  F --> S
  C --> S
  Z --> R[完成根因修正與驗證]
  R --> S
Error budget 是連接產品速度與可靠度的閥門;預算越少,變更政策越保守,耗盡時就把工程時間轉回穩定性。

走一遍範例 — 登雲書店

接著拿上一篇那 5 個 user story 來實際走一次,每個故事挑對應的 SLI / SLO 填出來。

故事 3.1 · 瀏覽暢銷榜

項目值
SLI 1(延遲)Load balancer 量測的 P95 首頁回應時間
SLO 1P95 < 1.5 秒,月度達成率 ≥ 99.5%
SLI 2(可用性)非 5xx 回應 / 總請求
SLO 2可用性 ≥ 99.9%(月度)
Error Budget 政策若月度 budget 用超過 50%,暫停新功能發佈

表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

故事 3.2 · 下單結帳

項目值
SLI 1(可用性)/api/checkout 成功率
SLO 199.99%(月度;每 1 萬次結帳請求最多 1 次失敗)
SLI 2(延遲)P95 結帳 API 端到端延遲
SLO 2P95 < 6 秒
SLI 3(正確性)每筆訂單金流狀態一致性
SLO 3每月金流錯帳率 < 0.001%

表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

故事 3.3 · 同步閱讀進度

項目值
SLI 1(延遲)裝置切換後進度同步完成時間
SLO 1P95 < 10 秒
SLI 2(正確性)進度衝突解決符合 last-write-wins
SLO 2錯誤進度回報率 < 0.1%

表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

故事 3.4 · 每日批次上傳庫存

項目值
SLI(吞吐)單批 200MB 處理時間
SLO99% 的批次在 30 分鐘內完成
SLI(延遲)批次失敗到寄出通知 email 的時間
SLO99.9% 的失敗案件在 5 分鐘內通知

表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

故事 3.5 · 查詢昨日銷售

項目值
SLI(資料新鮮度)前一日資料於 6am 前到位比率
SLO月度達成率 ≥ 95%
SLI(查詢延遲)標準報表查詢 P90
SLOP90 < 30 秒

表格超出欄寬時,可左右捲動;鍵盤可聚焦表格後用左右方向鍵查看。

這裡的 error budget 政策也要依服務分級。結帳預算消耗太快時,先檢查近期變更與故障原因,必要時暫緩高風險發布;內部報表則可用不同門檻。門檻應看消耗速度、剩餘時間和業務影響,不是每個團隊都套 20% 或 50%。

這幾張表刻意給不同目標:結帳、暢銷榜和內部報表的中斷影響不一樣。數字只是案例假設,正式訂 SLO 還得看流量、使用者回饋與歷史故障資料,不能只按服務名稱分級。

目標訂下來後,再找最可能讓服務失敗的地方。結帳可能要處理資料庫與付款依賴,暢銷榜則可評估快取或降級回應;是否需要多區域,要看故障範圍、RTO/RPO 和成本。下一篇談服務邊界時,也會把這些目標帶進去。


幾個常見的 SLO 誤用

第一個,把 SLA 直接當 SLO 用。 供應商的 SLA 說明服務承諾與補償條件;你的 SLO 則應反映使用者體驗和業務需求。兩者量測範圍也可能不同,不能只把 SLA 數字複製過來。若你對客戶另有承諾,還要檢查整條服務鏈能否支撐,而不只看單一雲端產品的 SLA。

第二個,所有服務都訂 99.99%。 結帳和內部報表的停機影響不同,不一定需要相同目標。先按使用者影響與業務風險分級,再決定各服務要投入多少備援成本。

第三個,只量後端、不量前端。 API 的 P95 不能代表使用者等待的全部時間;DNS、連線、CDN 與前端繪製也可能讓頁面變慢。若 SLO 是對使用者體驗的承諾,就要選能涵蓋相應路徑的量測方式。

📝 考場提點

遇到 SLI / SLO 的題目,先在腦中分兩刀。第一刀分「這是在量什麼」:可用性、延遲、吞吐、正確性,題目敘述裡的關鍵字(「回應時間」對延遲、「成功率」對可用性、「錯帳/資料對不對」對正確性)會直接告訴你。第二刀判「這個目標合不合理」——對外金流服務該嚴、內部工具該鬆,看到「全部統一」或「內部報表也要五個 9」這類,就該懷疑目標訂得比需求高。時間上別在單一 SLO 數字上糾結太久,要練的是「重要的服務訂高、次要的訂低」這個取捨原則,而不是背特定百分比。


延伸閱讀


下一步:SLO 訂好了,就能照著它把系統拆成微服務(Microservices),讓每個服務都揹著一個清楚的可靠度目標走。

🎯 換你練習

理論讀完,換自己來。到 架構師設計工作坊 · 步驟 4 填入你的 case study,邊寫邊內化。

PCA 雲端架構師之旅 — 第 4 篇/共 13 篇 查看系列全覽 →

讀完後,留一個學習紀錄

試著用自己的話說出一個重點,以及你會如何運用。實作文章請先核對結果與清理資源,再標記為讀完。

文章進度以你確認讀完的標記為準,可隨時取消。舊版造訪紀錄保留,但不計入讀完;這份自評不代表已掌握內容。

留言討論

文章目錄與系列

徽章解鎖!