六個系統(tǒng)設計的基本概念
一、簡介
這份綜合指南將引導你掌握在系統(tǒng)設計中取得成功所需的基本概念。
二、垂直和水平擴展
1. 垂直擴展
系統(tǒng)擴展的最直接方式是通過垂直擴展。這涉及升級現有服務器,例如增加更多的RAM或更快的CPU。
1*8OAEF45gAfOxvrTUz6hp3w.png
垂直擴展通常是處理用戶負載增加的快速解決方案。然而,從長遠來看,這并不是最有效的擴展方式。
2. 水平擴展
更高效的方法是水平擴展。在這種情況下,會添加服務器的副本,使每個副本處理一部分請求。
1*LfHAtNeWaNARDcmIaGVkXw.png
這比垂直擴展更為健壯,它帶來兩個關鍵的好處:
- 無限擴展性:你可以不斷添加服務器。
- 可靠性:如果一個服務器失敗,其他服務器可以繼續(xù)處理請求,減輕單點故障問題。
3. 負載均衡
為了防止服務器超載并有效地分發(fā)流量,負載均衡至關重要。
1*UmNTQRCU97JYoLAIqYMAyA.png
負載均衡器將入站用戶請求分配到多個服務器上,防止任何一個服務器成為瓶頸。
(1) 算法
負載均衡器使用各種算法來分發(fā)流量:
- 最少連接:將流量發(fā)送到具有最少打開連接的服務器。
- 基于資源:根據可用資源選擇服務器。
- IP哈希:根據源和目標IP地址的哈希將流量分配給服務器。
- 輪詢:按順序在服務器列表上分發(fā)流量。
- 自定義腳本:你還可以編寫根據需要定制的自定義算法。
(2) 技術
負載均衡的常見方法包括:
- 專業(yè)軟件:你可以使用像 Nginx 這樣的軟件,或者使用 AWS Elastic Load Balancing 等服務來實現負載均衡。
- 基于DNS:通過為域分配多個IP,使用DNS本身作為簡單的負載均衡器。然而,這種方法提供的定制性較少。
4.緩存
在系統(tǒng)中瓶頸通常不是Web服務器而是數據庫服務器。緩存涉及臨時存儲數據,通常在計算機的RAM中,以便在減輕數據庫負載的同時更快地服務未來的請求。
(1) 技術
為了實施緩存,你需要根據特定要求從一系列可用的軟件選項中進行選擇,例如 Redis、Nginx、Memcached 或 Cassandra。
(2) 緩存失效
為了保持緩存和數據庫同步,可以使用各種緩存失效策略。選擇正確的算法確保你的緩存既有效又高效。常見的算法有:
- 寫穿透緩存: 先更新緩存,然后更新數據庫。
- 寫回緩存: 先更新緩存,然后與數據庫同步。
(3) 但緩存在哪里?
緩存可以存在于應用程序架構的不同級別,包括:
- 客戶端: 在瀏覽器的緩存中。
- 服務器端: 使用像Redis或Memcached這樣的軟件。
- 數據庫: 通過在諸如MySQL的數據庫中進行查詢緩存。
5. 內容交付網絡(CDN)
通過內容交付網絡,可以實現另一層次的緩存。CDN是分布在多個地理位置的服務器網絡,用于存儲和提供Web內容,如圖像和視頻。它們在多個地理位置存儲您內容的緩存副本。
1*R5dl3WetVphgtjSjW1Kajg.png
CDN通常以以下幾種方式設置:
- 拉取式: CDN在首次用戶請求時從源服務器獲取數據并緩存。
- 推送式: 源服務器事先將數據推送到CDN。
知名的CDN提供商包括 Cloudflare、Google Cloud CDN、Amazon CloudFront 和 Microsoft Azure CDN。
6. API設計
(1) API設計充
當客戶端和服務器之間的契約。在設計API時,考慮以下關鍵因素:
- API類型:在設計API時,首先決定類型:RESTful、GraphQL或gRPC。
- 通信協議:HTTP、WebSockets等。
- 數據傳輸機制:JSON、XML或協議緩沖區(qū)。
- 安全性:考慮采取措施防范字典攻擊、XSS、CSRF、HPP攻擊,并使用速率限制。
- 查詢和排序:如何檢索和排序數據?
- 分頁:不要在一個請求中獲取所有數據,你需要分頁。
- 性能:優(yōu)化應用程序的初始加載時間。
- 錯誤處理:確保錯誤是一致且信息豐富的。
(2) 服務器驅動和客戶端驅動設計
根據你的應用程序,你可能會選擇服務器驅動或客戶端驅動的API設計,每種設計都提供一套自己的優(yōu)勢。
1*w0ybXh8JwTLGstzTREODIw.png
- 服務器驅動:適用于需要應用商店批準的移動應用程序發(fā)布的情況。
- 客戶端驅動:在客戶端方面提供更大的靈活性。
三、結論
從擴展策略和負載均衡技術到緩存和API設計的微妙之處,掌握這些領域可以讓你在競爭中具備強大的優(yōu)勢。