為什麼 NFR 決定架構

功能需求告訴你系統要「做什麼」,NFR 告訴你系統要「做到什麼程度」——而這個「程度」往往是架構選型的主要驅動力:

  • 「99.99% uptime」→ 逼出 Active-Active 多 AZ 部署,逼出 Saga Pattern 代替分散式 transaction
  • 「p99 latency < 50ms」→ 逼出 CQRS + 讀模型預先計算,逼出 Redis 作為查詢快取
  • 「每月 1TB 增長,三年不換架構」→ 逼出水平 Sharding,逼出 Partition 設計

先定 NFR,再選 Pattern。沒有 NFR 的架構設計是在猜。


NFR 分類

Performance

指標說明怎麼量化
Latency單個請求的回應時間p50 / p95 / p99(用百分位,不用平均)
Throughput單位時間能處理多少 requestRPS / QPS
Concurrency同時在線用戶 / 連線數峰值並發數

為什麼用 p99 不用平均:平均會被少量超快請求拉低,隱藏尾部延遲問題。100 個請求裡 99 個 10ms 回來、1 個 10000ms,平均是 108ms,p99 是 10000ms——用戶的痛在 p99。

Scalability

  • 垂直擴展(Scale Up):換更強的機器。有天花板,停機升級有風險。
  • 水平擴展(Scale Out):加更多機器,最終要能做到 stateless + load balancing。

量化:「需要支撐當前 10 倍流量,不修改架構的情況下」

Reliability / Availability

概念定義
Availability系統可用的時間比例
MTBFMean Time Between Failures,失敗之間的平均時間
MTTRMean Time To Recovery,從失敗到恢復的平均時間
RTORecovery Time Objective,可接受的最長恢復時間
RPORecovery Point Objective,可接受的最大資料遺失時間
可用性數字對照:
99%    = 每年 87.6 小時停機
99.9%  = 每年 8.76 小時停機
99.95% = 每年 4.38 小時停機(月約 21 分鐘)
99.99% = 每年 52.6 分鐘停機(月約 4.4 分鐘)

Durability

資料不丟失——和 Availability 不同,Availability 是「系統能用」,Durability 是「資料不消失」。

AWS S3 保證 99.999999999%(11 個 9)Durability,但 Availability 只保 99.99%——S3 偶爾會暫時不能存取,但你的物件不會消失。

Observability

  • 系統自己能告訴你哪裡出問題(Metrics / Logs / Traces)
  • alert 能在用戶報告前先發出
  • 能在不重啟的情況下診斷問題

NFR 量化:「所有 API 都有 latency / error rate metric;p99 latency 超過 500ms 要 alert」

Security

  • 靜態資料加密(at-rest encryption)
  • 傳輸加密(TLS)
  • 認證(Authentication)和授權(Authorization)的邊界
  • GDPR / PCI-DSS / SOC 2 等合規要求(Compliance NFR)

Maintainability

  • 新工程師多久能上手修 bug(onboarding time)
  • 測試覆蓋率目標
  • 技術債的可接受上限

NFR 之間的衝突

NFR 很少同時成立,常見的衝突:

衝突說明
Availability vs ConsistencyCAP Theorem——無法同時保 AP + CP
Security vs Developer Experience嚴格的認證流程減慢開發速度
Performance vs Cost更低延遲需要更多資源
Flexibility vs Maintainability高度靈活的架構通常更難維護

在需求文件裡明確寫出衝突並記錄取捨決定,讓未來的人知道為什麼是這樣設計的。


怎麼寫有意義的 NFR

壞的 NFR(無法驅動架構決策):

  • ❌ 「系統要快」
  • ❌ 「要穩定」
  • ❌ 「要安全」

好的 NFR(能驅動架構決策):

  • ✅ 「首頁 API p99 latency < 200ms(東京 region);超過觸發 alert」
  • ✅ 「月可用性 >= 99.95%;計劃維護每月 < 2 次,每次 < 30 分鐘」
  • ✅ 「用戶資料符合 GDPR;PII 欄位 at-rest 加密;audit log 保留 3 年」
  • ✅ 「支撐當前 5 倍流量不改架構;10 倍需要加機器不需要改 code」

NFR → SLO / SLA

SLI(Service Level Indicator):衡量服務表現的指標(如 error rate、latency)

SLO(Service Level Objective):對 SLI 的目標(如 p99 latency < 200ms in 99.9% of rolling 30d windows)

SLA(Service Level Agreement):對外的承諾,通常比 SLO 更保守(有違約賠償)

Error Budget:SLO 允許的失敗空間。99.9% SLO = 每月 43 分鐘 error budget。用完了就停功能開發,優先穩定性。