🎯 什麼情境該想到我

當你要評估或設計一個資料/後端系統,想有一套「該顧哪些面向」的總框架時。

⚙️ 怎麼用(三個評估軸)

  1. 可靠性(Reliability):即使硬體/軟體/人為出錯,仍能正確運作。→ 設計容錯,主動注入故障測試。
  2. 可擴展性(Scalability):先定義負載參數(QPS、讀寫比、資料量),再看負載成長時效能如何。用百分位(p95/p99)談延遲,別只看平均。
  3. 可維護性(Maintainability):可運維性、簡單性(控制複雜度)、可演進性。

面對任何系統,逐軸問一遍,就不會漏掉非功能面。

★ 可靠性:三種故障,三種應對

故障類型例子★ 應對
硬體磁碟壞、機器當、斷電冗餘(複製、多可用區)——這是最容易解的一種
軟體bug、記憶體洩漏、失控的重試★ 難得多:相關聯的故障會同時發生在所有節點上
★ 人為設定錯誤、誤操作★ 統計上最大的故障來源

★ 「人為是最大來源」這一點最常被忽略。對策不是「叫人更小心」,而是:

  • 讓正確的事容易做、錯的事難做(好的預設值、危險操作要多一道確認)
  • 沙箱環境讓人可以安全地試
  • ★ 快速回滾比「不要出錯」更實際(見 工具-低風險發布模式)
  • 完整的遙測(見 工具-遙測與監控)

★ 可擴展性:必須先定義「負載參數」

「這個系統可擴展嗎」是一個無法回答的問題。 要先問:

① 負載參數是什麼?
   ★ 不同系統的關鍵參數完全不同:
   Web 服務 → QPS
   資料庫   → 讀寫比
   聊天室   → 同時在線人數
   ★ Twitter → 「每個使用者的追蹤者數分布」(不是總推文數)

② 負載增加時,系統怎麼變?
   固定資源下,效能降低多少?
   要維持效能,資源要增加多少?

★ Twitter 的例子值得記住:

瓶頸不是「每秒幾則推文」,而是**「名人發一則推文要寫進幾百萬個時間線」**——
找對負載參數,才找得到真正的瓶頸。 找錯了,優化全部做在沒用的地方。

★★ 延遲一定要用百分位,不能用平均

100 個請求:99 個 10ms,1 個 5000ms
平均 = 59.9ms    ← ★ 這個數字騙了你
p99  = 5000ms    ← ★ 這才是「最糟的那 1% 使用者」的體感
為什麼說明
★ 平均會被長尾拉走,但又掩蓋長尾它既不代表典型,也不代表最糟
★ 尾延遲放大(tail latency amplification)一個請求要呼叫 10 個後端,只要有一個慢,整個請求就慢。
後端 p99 = 1%,則前端「至少碰到一個慢的」機率 ≈ 9.6%——尾巴被放大了 10 倍
★ 最重要的使用者常在尾巴資料最多的往往是最有價值的客戶

要看的指標:p50(典型)、p95、p99、p999、max。
★ 而且百分位不能平均(三台機器的 p99 各是 100ms ≠ 整體 p99 是 100ms)——
要用直方圖或 t-digest 合併(見 順序統計量與中位數)。

★ 可擴展的兩個方向

垂直(scale up)水平(scale out)
做法換更大的機器加更多機器
複雜度★ 低(什麼都不用改)高(分區、複製、一致性)
上限有物理上限幾乎無限
建議★ 先垂直。單機現在可以很大(TB 記憶體、上百核心)垂直撐不住才水平

★ 「無狀態服務水平擴展很容易,有狀態的很難」——
所以架構設計的一個核心目標是把狀態集中到少數地方(資料庫、快取),讓其他部分無狀態。

★ 可維護性:三個子維度

維度問什麼
可運維性★ 出事時能不能快速知道、快速定位、快速修?(遙測、runbook、可回滾)
簡單性★ 新人多久能上手?複雜度是本質的還是偶然的?(見 工具-管理複雜度)
可演進性需求變了,改起來容易嗎?

★ 「偶然複雜度」是可以被消除的(Brooks 的區分):
本質複雜度來自問題本身;偶然複雜度來自我們的解法——
工具爛、抽象錯、歷史包袱。可維護性的工作幾乎都在消除偶然複雜度。

★ 怎麼實際使用這三軸

在設計 review 或系統設計面試時,逐軸問一遍:

可靠性   → 哪裡會掛?掛了會怎樣?人為失誤怎麼防?能多快回滾?
可擴展性 → 負載參數是什麼?10 倍時哪裡先爆?p99 是多少?
可維護性 → 誰來維運?出事怎麼查?新人要多久上手?

★ 這三個問題涵蓋了幾乎所有「非功能需求」,而它們正是系統設計評審真正在看的東西
(見 AI 系統設計框架、工具-系統設計思考框架)。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

⚠️ 注意 / 什麼時候不適用

  • ★ 三者互相衝突。更可靠通常更慢更貴;更可擴展通常更複雜(更難維護)。
    這是取捨不是清單——要明說你選了哪一邊、為什麼。
  • ★ 不要過早追求可擴展性。「未來可能要撐一百萬使用者」是最常見的過度設計理由。
    先做能跑的簡單系統,量出真正的瓶頸再擴展——而且那時你才知道正確的負載參數。
  • 可靠性有邊際成本。從 99% 到 99.9% 不貴;從 99.99% 到 99.999% 可能要十倍投入。
    ★ 先問業務需要多少個 9,不要預設越高越好。
  • ★ 平均值幾乎永遠是錯的指標(見上)。
  • 可維護性最難量化,所以最容易被犧牲。→ 用可觀測的代理指標:
    DORA 的交付指標:吞吐量(變更前置時間、部署頻率、失敗部署的恢復時間)與不穩定度(變更失敗率、部署重工率),共五項;「失敗部署的恢復時間」取代了早期的 MTTR(查證 2026-09-25,見 工具-部署管線與持續交付)。
  • 「可擴展的架構」不存在,只有「針對某種負載可擴展」。負載模式變了就要重新設計。

🔗 相關工具