這份指南依據現實中最常見的情境,提供概括性的思考方向,幫助工程師在初期規劃時,選擇適合的開發工具及系統架構。
Database Selection
在實際情況中,如何使用關聯式資料庫(Relational Database)並設計出靈活高效的 Schema,是影響系統效能與安全性的關鍵。
1. Read/Write Heavy,Latency
2. Security:Auditing,Access Control
Time-series Database 常用在 IoT 場景、NoSQL Database 常用於大量快速回應的場境;
但要小心不要因為「可以隨時 Scaling」、「可以應付突發的 Concurrency」等尚未發生的需求,而失去了資料庫 Schema 的主軸。
API Design
API Design 需要每個參與系統開發的人員充分討論並理解。
很重要的兩個原則
- 保持簡潔,努力維持一致性。有好的基礎,才會有好的擴展性
- 永遠要考量成本,搜尋成本、讀寫成本、回應時間成本、網路費、程式碼維護成本等等
使用正規語言來理解 API、討論如何設計 API
- 風格、模式
- RESTful
- RPC(Remote Procedure Call)
- GraphQL
- 事件驅動:WebHooks
- 持續連結的 HTTP:HTTP Streaming
- 全雙工:WebSockets(非 HTTP)
- 安全性
- 身份驗證與授權:OAuth
- 存取範圍,存取操作限制
- 速率限制
- 回應說明與錯誤處理
- Microsoft Azure REST API Guidelines:有許多硬性規定
- Microsoft Graph REST API Guidelines:有許多軟性建議
- PayPal API Responses:如何撰寫清楚的回應說明
- Google Cloud API Design Guide:如何做好錯誤處理
- Stripe API:如何做好錯誤處理
Version Control & Code Review Processes
- 使用 Git 進行版本控制是最基本的;Commit 流程以及 Commit Message 能有規範更好
- Code Review 確實執行,可降低日後維護成本
- 測試覆蓋率與耗費成本正相關
Deployment & Hosting
這些繁瑣的環境參數設定及流程,務必要有清楚的版本控制。
- Backup and Recovery:Docker
- 流程自動化:CI/CD
- Monitoring and Alerting:有的人比較在乎紀錄搜尋速度及分析功能,有的人比較在乎視覺化及警告串接功能
Load Balancing
如果上列步驟有確實完成的話,Load Balancing 就不是問題。 機器如果是自架,錢主要會花在買設備、買頻寬; 機器如果在雲端,錢就花在買穩定、方便的服務。
其他
- UI/UX
- Web Accessibility
- User Feedback and Analysis
- SEO
從 3 個層面來檢視 System Design
可靠性 Reliability
- 硬體故障
- 軟體錯誤
- 人為疏失
可擴展性 Scalability
- Load Parameters(負載參數)
- Latency Percentiles
- Throughput
可維護性 Maintainability
- 可操作性(Operability)
- 簡單(Simplicity)
- 演化能力(Evolvability)(或稱 Extensibility、Modifiability、Plasticity)