16個系統設計中的核心概念
系統設計是計算機科學技術領域的重要主題。在系統設計中,對于負載均衡、緩存、分區、復制、數據庫和代理等基本設計概念的深入理解是十分重要和必要的。這些概念是系統設計的關鍵要素,對于設計高質量的系統和應對各種挑戰至關重要。通過掌握理解這些基本思想,對于提升設計水平和獲取更好的設計成果非常有幫助。
本文介紹16個基本的系統設計概念。
1 域名系統(DNS,Domain Name System )
域名系統(DNS)是互聯網基礎架構的核心組成部分,將人類友好的域名轉換為相應的IP地址。它的功能類似于互聯網的電話簿,允許用戶通過鍵入易于記憶的域名(如www.designgurus.io)而不是計算機用于相互識別的數字IP地址(如“192.0.2.1”)來訪問網站和服務。
當在網絡瀏覽器中輸入一個域名時,DNS負責查找相關的IP地址并將您的請求引導到正確的服務器。該過程始于您的計算機向遞歸解析器發送查詢請求,然后遞歸解析器搜索一系列的DNS服務器,從根服務器開始,然后是頂級域(TLD)服務器,最后是權威名稱服務器。一旦找到IP地址,遞歸解析器將其返回給您的計算機,使您的瀏覽器能夠與目標服務器建立連接并訪問所需的內容。
2 負載均衡器(Load Balancer)
負載均衡器是一種網絡設備或軟件,用于將傳入的網絡流量分配到多個服務器,以確保資源的最佳利用、降低延遲并保持高可用性。它在擴展應用程序和有效管理服務器工作負載方面發揮著至關重要的作用,特別是在流量突增或請求在服務器之間分布不均的情況下。
負載均衡器使用不同的算法來確定如何分配傳入的流量。常見的算法包括:
- 輪詢:請求按照順序循環地均勻分布到所有可用服務器上。
- 最少連接:負載均衡器將請求分配給活動連接最少的服務器,優先選擇負載較輕的服務器。
- IP 哈希:客戶端的 IP 地址經過哈希計算,得到的值用于確定請求應該發送到哪個服務器。這種方法可以確保特定客戶端的請求始終被路由到同一臺服務器上,有助于維持會話持久性。
圖片
3 API 網關(API Gateway)
API 網關是一個服務器或服務,充當外部客戶端與應用程序內部微服務或基于 API 的后端服務之間的中間人。它是現代架構中的關鍵組件,特別適用于基于微服務的系統,可以簡化通信過程,并為客戶端提供訪問各種服務的單一入口點。
API 網關的主要功能包括:
- 請求路由:根據預定義的規則和配置,將來自客戶端的 API 請求定向到適當的后端服務或微服務。
- 身份驗證和授權:API 網關可以處理用戶的身份驗證和授權,確保只有經過授權的客戶端可以訪問服務。它可以驗證 API 密鑰、令牌或其他憑據,然后將請求路由到后端服務。
- 速率限制和流量控制:為了保護后端服務免受過載或濫用,API 網關可以根據預定義的策略強制執行速率限制或對來自客戶端的請求進行流量控制。
- 緩存:為了降低延遲和后端負載,API 網關可以緩存頻繁使用的響應,直接提供給客戶端,而無需查詢后端服務。
- 請求和響應轉換:API 網關可以修改請求和響應,例如轉換數據格式、添加或刪除標頭,或修改查詢參數,以確保客戶端與服務之間的兼容性。
圖片
4 內容分發網絡(CDN,Content Delivery Network)
內容分發網絡(CDN)是由分布在全球各地的服務器組成的網絡,用于存儲和傳遞內容,如圖片、視頻、樣式表和腳本,以從地理上更接近用戶的位置提供服務。CDN旨在改善內容傳遞到最終用戶的性能、速度和可靠性,無論用戶與源服務器的位置關系如何。
CDN的工作原理如下:
- 當用戶請求網站或應用程序的內容時,請求會被定向到最近的CDN服務器,也稱為邊緣服務器。
- 如果邊緣服務器已經緩存了所請求的內容,它會直接向用戶提供內容。這樣可以減少延遲并改善用戶體驗,因為內容傳輸的距離更短。
- 如果邊緣服務器上沒有緩存所請求的內容,CDN會從源服務器或其他附近的CDN服務器檢索內容。一旦獲取到內容,它會被緩存在邊緣服務器上并提供給用戶。
- 為了確保內容保持最新,CDN會定期檢查源服務器是否有變更,并相應地更新緩存。
圖片
5 正向代理與反向代理(Forward Proxy vs. Reverse Proxy)
正向代理,也稱為“代理服務器”或簡稱為“代理”,是位于一個或多個客戶機前面的服務器,充當客戶機與互聯網之間的中間人。當客戶機請求互聯網上的資源時,請求首先發送到正向代理。正向代理會代表客戶機將請求轉發到互聯網,并將響應返回給客戶機。
反向代理是位于一個或多個Web服務器前面的服務器,充當Web服務器與互聯網之間的中間人。當客戶端請求互聯網上的資源時,請求首先發送到反向代理。反向代理將請求轉發給其中一個Web服務器,然后將響應返回給反向代理。反向代理再將響應返回給客戶端。
圖片
6 緩存(Caching)
緩存是位于應用程序和數據的原始來源(如數據庫、文件系統或遠程Web服務)之間的高速存儲層。當應用程序請求數據時,首先在緩存中進行檢查。如果緩存中存在數據,則將其返回給應用程序。如果緩存中不存在數據,則從原始來源檢索數據,將其存儲在緩存中供將來使用,并返回給應用程序。在分布式系統中,可以在多個位置進行緩存,例如客戶端、DNS、CDN、負載均衡器、API網關、服務器、數據庫等。
圖片
7 數據分區(Data Partitioning)
在數據庫中,水平分區,也稱為分片(sharding),涉及將表的行分成較小的表,并將它們存儲在不同的服務器或數據庫實例上。這樣做是為了將數據庫的負載分布到多個服務器上,以提高性能。
另一方面,垂直分區涉及將表的列分成單獨的表。這樣做是為了減少表中的列數,并提高僅訪問少數列的查詢的性能。
圖片
8 數據庫復制(Database Replication)
數據庫復制是一種技術,用于在不同的服務器或位置上維護同一數據庫的多個副本。數據庫復制的主要目的是提高數據的可用性、冗余性和容錯性,確保系統在硬件故障或其他問題的情況下繼續運行。
在復制數據庫的設置中,一個服務器充當主數據庫(或主庫),而其他服務器則充當副本(或從庫)。該過程涉及在主數據庫和副本之間同步數據,以使它們都具有相同的最新信息。數據庫復制提供了多個優點,包括:
- 提高性能:通過在多個副本之間分布讀查詢,可以減輕主數據庫的負載并提高查詢響應時間。
- 高可用性:在主數據庫發生故障或停機的情況下,副本可以繼續提供數據,確保應用程序的不間斷訪問。
- 增強數據保護:在不同位置擁有數據庫的多個副本有助于防止由于硬件故障或其他災難導致的數據丟失。
- 負載均衡:副本可以處理讀查詢,從而實現更好的負載分配,減輕主數據庫的總體壓力。
9 分布式消息系統(Distributed Messaging Systems)
分布式消息系統能夠在可靠、可擴展和容錯的方式下,在多個潛在地理分布的應用程序、服務或組件之間進行消息交換。通過解耦發送者和接收者組件來促進通信,使它們能夠獨立演化和運行。分布式消息系統特別適用于大規模或復雜的系統,例如微服務架構或分布式計算環境中的系統。Apache Kafka和RabbitMQ是此類系統的示例。
10 微服務(Microservices)
微服務是一種架構風格,將應用程序結構化為一組小型、松耦合和獨立可部署的服務。每個微服務負責應用程序中特定的功能或領域,并通過明確定義的API與其他微服務進行通信。這種方法與傳統的單體架構不同,傳統單體架構將應用程序構建為單個緊密耦合的單元。
微服務的主要特點包括:
- 單一職責:每個微服務專注于特定的功能或領域,遵循單一職責原則。這使得服務更易于理解、開發和維護。
- 獨立性:微服務可以獨立開發、部署和擴展,相互之間沒有依賴。這增加了開發過程的靈活性和敏捷性,團隊可以同時處理不同的服務,而不影響整個系統。
- 去中心化:微服務通常是去中心化的,每個服務擁有自己的數據和業務邏輯。這鼓勵關注點分離,并使團隊能夠根據自己的特定需求做出決策和選擇技術。
- 通信:微服務使用輕量級的協議進行通信,如HTTP/REST、gRPC或消息隊列。這促進了互操作性,使得容易集成新的服務或替換現有的服務。
- 容錯性:由于微服務是獨立的,一個服務的失敗不一定會導致整個系統失敗。這有助于提高應用程序的整體彈性。
11 NoSQL數據庫(NoSQL Databases)
NoSQL數據庫(非關系型數據庫)是設計用于存儲、管理和檢索非結構化或半結構化數據的數據庫。它們提供了傳統關系型數據庫的替代方案,傳統關系型數據庫依賴結構化數據和預定義模式。NoSQL數據庫因其靈活性、可擴展性和處理大量數據的能力而受到歡迎,特別適用于現代應用、大數據處理和實時分析。
NoSQL數據庫可以分為四種主要類型:
- 基于文檔:這些數據庫將數據存儲在類似文檔的結構中,如JSON或BSON。每個文檔是自包含的,可以具有自己獨特的結構,適用于處理異構數據。例如,MongoDB和Couchbase是基于文檔的NoSQL數據庫的示例。
- 鍵值對:這些數據庫將數據存儲為鍵值對,其中鍵充當唯一標識符,值包含相關數據。鍵值對數據庫在簡單的讀寫操作上非常高效,并且可以容易地進行分區和水平擴展。例如,Redis和Amazon DynamoDB是鍵值對NoSQL數據庫的示例。
- 列族:這些數據庫將數據存儲在列族中,列族是一組相關列的集合。它們設計用于處理寫入密集型工作負載,并且對于查詢具有已知行和列鍵的數據非常高效。例如,Apache Cassandra和HBase是列族NoSQL數據庫的示例。
- 基于圖:這些數據庫設計用于存儲和查詢具

12 數據庫索引(Database Index)
數據庫索引是一種提高數據庫查詢操作速度和效率的數據結構。工作方式類似于書中的索引,允許數據庫管理系統(DBMS)快速定位與特定值或值集相關聯的數據,而無需搜索表中的每一行。通過提供更直接的路徑以獲取所需數據,索引可以顯著減少從數據庫檢索信息所需的時間。
索引通常建立在一個或多個數據庫表的列上。最常見的索引類型是B樹索引,它以層次結構的樹形結構組織數據,實現快速搜索、插入和刪除操作。還有其他類型的索引,如位圖索引和哈希索引,每種索引都有其特定的用例和優勢。
雖然索引可以顯著提高查詢性能,但也存在一些權衡:
- 存儲空間:索引占用額外的存儲空間,因為它們在原始表數據旁創建和維護單獨的數據結構。
- 寫入性能:當在表中插入、更新或刪除數據時,相關的索引也必須進行更新,這可能會降低寫入操作的速度。

13 分布式文件系統(Distributed File Systems)
分布式文件系統是設計用于管理和提供對文件和目錄的訪問的存儲解決方案,通常跨多臺服務器、節點或機器進行分布,常常分布在一個網絡上。它們使用戶和應用程序能夠像在本地文件系統上存儲文件一樣訪問和操作文件,即使實際文件可能物理上存儲在多個遠程服務器上。分布式文件系統通常用于大規模或分布式計算環境中,以提供容錯性、高可用性和改進的性能。
14 通知系統(Notification System)
通知系統用于向用戶發送通知或提醒,例如電子郵件、推送通知或短信。
15 全文搜索(Full-text Search)
全文搜索使用戶能夠在應用程序或網站中搜索特定的單詞或短語。當用戶查詢時,應用程序或網站返回最相關的結果。為了快速高效地完成這一操作,全文搜索依賴于倒排索引,它是一種將單詞或短語映射到出現它們的文檔的數據結構。Elastic Search就是這類系統的一個例子。
16 分布式協調服務(Distributed Coordination Services)
分布式協調服務是一種設計用于可靠、高效和容錯地管理和協調分布式應用程序、服務或節點活動的系統。它們有助于維護一致性、處理分布式同步,并管理分布式環境中各種組件的配置和狀態。分布式協調服務特別適用于大規模或復雜的系統,例如微服務架構、分布式計算環境或集群數據庫。Apache ZooKeeper、etcd和Consul是此類服務的示例。
總結
通過使用上述系統設計概念和模板,能夠最大化在系統設計面試中成功的機會。以下是一些常見的系統設計面試問題列表:
- 設計類似Google Drive或Dropbox的文件共享服務。
- 設計視頻流媒體平臺。
- 設計URL縮短服務。
- 設計網絡爬蟲。
- 設計Uber。
- 設計Facebook Messenger。
- 設計Twitter搜索。
希望本文對讀者的面試和工作有幫助。






























