🎯 什麼情境該想到我

當你要讓網站/服務「扛住高流量、少當機、能加機器就變強」時。

⚙️ 怎麼用(兩大目標的核心手法)

高可用(少當機):

  1. 消除單點:關鍵元件都要有冗餘備援 + 自動故障切換。
  2. 服務無狀態:狀態外置(快取/DB),任一台掛了流量可轉到別台。
  3. 故障隔離:艙壁、限流、降級(見 工具-服務容錯設計),別讓局部拖垮全局。

伸縮性(能水平擴展):
4. 無狀態 + 負載均衡 → 加機器就能分攤(見 工具-透明多級分流)。
5. 資料層靠分片 + 讀寫分離(見 工具-資料分區、工具-資料複製)。
6. 非同步削峰:用訊息佇列把尖峰流量緩衝、削峰填谷。

★ 先算清楚「幾個 9」的真實意義

SLA每年可停機每月代價
99%3.65 天7.2 小時低
99.9%8.8 小時43 分鐘中
99.95%4.4 小時22 分鐘★ 多數 SaaS 的實際目標
99.99%52 分鐘4.3 分鐘★ 高(要多可用區 + 自動故障轉移)
99.999%5.3 分鐘26 秒★ 極高(幾乎沒有人工介入的餘地)

(「每月」以 30 天 = 43,200 分鐘計:99.9% → 43.2 分鐘、99.99% → 4.32 分鐘;若用平均月長 365/12 ≈ 30.44 天 ≈ 730 小時,則是 43.8、4.38 分鐘,即 工具-容量估算 表上的數字。)

★ 99.99% 代表「一個月只有 4 分鐘」——
這比「人被叫醒 + 登入 + 判斷 + 處理」還短。

所以四個 9 以上幾乎必然要求「全自動故障轉移」,而那本身就是一個複雜且會出錯的系統。

★ 先問業務要幾個 9,不要預設越高越好——每多一個 9,成本大約是十倍。

★ 可用性是「相乘」的,不是「取最小」

服務 A(99.9%)同步呼叫 B(99.9%)與 C(99.9%)
★ 整體 = 0.999³ = 99.7%    ← 比任何單一元件都差

★ 每增加一個同步依賴,可用性都在下降。

這推出三條設計原則:

原則說明
★ 減少同步依賴能非同步就非同步(見 工具-訊息傳遞整合模式)
★ 讓依賴可選推薦服務掛了仍能結帳(降級,見 工具-服務容錯設計)
冗餘讓可用性相加兩個副本並聯:

★ 找單點的系統化方法

逐項問「這個掛了會怎樣」:

□ 負載均衡器本身        → 多台 + VIP/DNS 故障轉移
□ ★ 資料庫主庫          → 最常見的單點。需要 failover(見 [[工具-資料複製]])
□ 快取                 → 掛了會不會把流量全打到 DB?(★ 快取雪崩)
□ ★ 訊息佇列            → 叢集化
□ ★ 設定中心 / 服務發現  → 掛了服務還起得來嗎?要有本地快取
□ 物件儲存 / CDN        → 通常是託管的,但要看 SLA
□ ★ 憑證 / DNS 到期      → ★ 最常被忘記的單點,而且會全站掛掉
□ ★ 單一可用區          → 整個機房掛掉
□ ★ 部署流程本身        → CI 掛了能不能緊急上線?
□ ★ 人                 → 只有一個人會處理某件事

★ 最後三項最常被忽略,而且它們造成的事故最久。

★ 無狀態為什麼是可擴展的前提

有狀態(session 存在記憶體)
  → 使用者必須回到同一台(sticky session)
  → ★ 那台掛了,使用者的狀態就沒了
  → ★ 無法自由擴縮(加機器不會分擔既有使用者)
  → 部署要考慮 draining

無狀態(session 存 Redis / JWT)
  → ★ 任何一台都能處理任何請求
  → 加機器立刻分擔、掛一台無感、部署可以直接滾動

★ 「把狀態集中到少數地方」是架構設計的核心手法:
應用層無狀態(容易擴展)+ 狀態集中在資料庫/快取(難擴展但只有一處要處理)。

★ 削峰填谷:非同步化的三種形態

形態做什麼適合
佇列緩衝收下請求先回 202,背景處理★ 不需要即時結果的(寄信、產報表、轉檔)
★ 批次合併把 N 個小寫入合併成一次大寫入高頻小寫入(計數、日誌)
★ 限流 + 排隊超過容量就排隊或拒絕秒殺、搶票(見 工具-秒殺系統設計)

★ 關鍵:佇列不是無限的緩衝。

生產者長期快於消費者 → 佇列無限成長 → 記憶體/磁碟爆掉,而且延遲會變得極長。
佇列只能吸收「尖峰」,不能解決「容量不足」。
→ 一定要有有界佇列 + 背壓 + 監控佇列長度(見 工具-MQ消費端防禦三原則)。

★ 可用性的敵人往往不是硬體

真實的停機原因對策
★ 部署出錯金絲雀 + 快速回滾(見 工具-低風險發布模式)
★ 設定變更設定也要走 review 與灰度
★ 憑證/網域過期自動續期 + 到期告警
★ 依賴的第三方掛了降級路徑
流量尖峰限流 + 自動擴縮
硬體故障冗餘(這是最容易解的一種)

★ 統計上,「變更」是絕大多數事故的觸發點——
所以提升可用性最有效的單一手段,是「讓變更更安全」而不是「加更多冗餘」。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

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

  • ★ 自動故障轉移本身會製造事故。誤判、腦裂、轉移到一個也壞的節點。
    很多成熟團隊選擇半自動(自動偵測 + 人工確認)——錯誤的 failover 比晚幾分鐘恢復更糟
    (見 工具-資料複製、工具-故障偵測)。
  • ★ 冗餘要真的獨立。兩台機器在同一個機架、同一個電源、同一個可用區 → 不是冗餘。
  • ★ 快取掛掉要能撐住。快取雪崩(大量 key 同時過期或快取整個掛)會讓流量瞬間全打到 DB。
    → TTL 加隨機抖動、快取掛了要限流保護 DB。
  • 演練過的才算有。沒演練過的 failover 在真正需要時多半會失敗(見 工具-注入故障與韌性演練、遊戲日)。
  • ★ SLA 要包含「誰來承諾什麼」。99.99% 不含計畫性維護?不含第三方故障?這些都要寫清楚。
  • 備份 ≠ 高可用。備份解決「資料遺失」,高可用解決「服務中斷」。兩者都要,而且備份要定期演練還原。

🔗 相關工具