16 個在面試前需要知道的系統設計概念
要在關于系統設計的面試中脫穎而出,最關鍵的方面之一是深入理解基本的系統設計概念,例如,負載平衡、緩存、分區、復制、數據庫和代理。
根據我自己的經驗,我確定了 16 個關鍵概念,它們可以幫助你提高解決系統設計問題的能力。
這些概念的范圍從理解 API 網關的復雜性和掌握負載平衡技術到掌握 CDN 的重要性和理解緩存在現代分布式系統中的作用。閱讀完本文時,你將全面了解這些基本思想,并有信心在下一次面試中應用它們。
系統設計面試本質上是非結構化的。在面試過程中,很難跟蹤事情并確保你已經觸及設計的所有基本方面。
為了簡化這個過程,我開發了一個系統設計主模板,可以幫助你回答任何系統設計面試問題,深入了解任何系統設計中可能涉及的關鍵組件。
請牢記這個主模板,我們將討論 16 個基本系統設計概念。
現在我們開始吧。
1.域名系統(DNS)
域名系統 (DNS) 是互聯網基礎設施的基本組成部分,可將人類友好的域名轉換為相應的 IP 地址。
它的功能類似于 Internet 電話簿,允許用戶通過鍵入易于記憶的域名(例如 www.google.com)而不是計算機用來相互識別的數字 IP 地址(例如“192.168.2.1”)來訪問網站和服務。
當你在 Web 瀏覽器中輸入域名時,DNS 負責查找關聯的 IP 地址并將你的請求定向到正確的服務器。
該過程從你的計算機向遞歸解析器發送查詢開始,然后搜索一系列 DNS 服務器,從根服務器開始,然后是頂級域 (TLD) 服務器,最后是權威名稱服務器。
找到 IP 地址后,遞歸解析器會將其返回到你的計算機,讓你的瀏覽器與目標服務器建立連接并訪問所需的內容。
2.負載均衡器
負載均衡器是一種網絡設備或軟件,可在多個服務器之間分配傳入的網絡流量,以確保最佳的資源利用率、減少延遲并保持高可用性。
它在擴展應用程序和有效管理服務器工作負載方面起著至關重要的作用,尤其是在流量突然激增或服務器之間請求分布不均的情況下。
負載均衡器使用不同的算法來確定如何分配傳入流量。
常見的算法包括:
- 循環:請求以循環方式按順序均勻分布在所有可用服務器上。
- 最少連接:負載均衡器將請求分配給活動連接最少的服務器,優先處理不太繁忙的服務器。
- IP 哈希:對客戶端的 IP 地址進行哈希處理,結果值用于確定應將請求定向到哪個服務器。此方法可確保特定客戶端的請求始終路由到同一服務器,從而有助于保持會話持久性。
3.API網關
API 網關是一種服務器或服務,充當外部客戶端與應用程序的內部微服務或基于 API 的后端服務之間的中介。它是現代架構中的一個重要組件,尤其是在基于微服務的系統中,它簡化了通信過程并為客戶端提供了訪問各種服務的單一入口點。
API網關的主要功能包括:
- 請求路由:它根據預定義的規則和配置,將來自客戶端的傳入 API 請求定向到適當的后端服務或微服務。
- 身份驗證和授權:API網關可以處理用戶身份驗證和授權,確保只有授權的客戶端才能訪問服務。它可以在將請求路由到后端服務之前驗證 API 密鑰、令牌或其他憑據。
- 速率限制和節流:為了保護后端服務免受過度負載或濫用,API 網關可以根據預定義的策略強制執行速率限制或節流來自客戶端的請求。
- 緩存:為了減少延遲和后端負載,API 網關可以緩存常用的響應,直接將它們提供給客戶端,而無需查詢后端服務。
- 請求和響應轉換:API 網關可以修改請求和響應,例如轉換數據格式、添加或刪除標頭或修改查詢參數,以確保客戶端和服務之間的兼容性。
4.CDN
內容分發網絡 (CDN) 是一種分布式服務器網絡,用于存儲圖像、視頻、樣式表和腳本等內容并將其分發給地理位置較近的用戶。CDN 旨在提高向最終用戶交付內容的性能、速度和可靠性,無論他們相對于原始服務器的位置如何。
CDN 的工作原理如下:
- 當用戶從網站或應用程序請求內容時,請求會被定向到最近的 CDN 服務器,也稱為邊緣服務器。
- 如果邊緣服務器緩存了請求的內容,它會直接將內容提供給用戶。這減少了延遲并改善了用戶體驗,因為內容傳輸的距離更短。
- 如果內容未緩存在邊緣服務器上,則 CDN 從源服務器或附近的另一個 CDN 服務器檢索它。獲取內容后,會將其緩存在邊緣服務器上并提供給用戶。
- 為確保內容保持最新,CDN 會定期檢查源服務器的更改并相應地更新其緩存。
5. 正向代理與反向代理
轉發代理,也稱為“代理服務器”或簡稱為“代理”,是位于一臺或多臺客戶端計算機前面并充當客戶端和 Internet 之間的中介的服務器。
當客戶端機器向 Internet 上的資源發出請求時,該請求首先被發送到轉發代理。然后,轉發代理代表客戶端將請求轉發到 Internet,并將響應返回給客戶端。
反向代理是位于一個或多個 Web 服務器之前的服務器,充當 Web 服務器和 Internet 之間的中介。
當客戶端向 Internet 上的資源發出請求時,該請求首先被發送到反向代理。
然后反向代理將請求轉發到其中一個 Web 服務器,該服務器將響應返回給反向代理。然后反向代理將響應返回給客戶端。
6.緩存
緩存是位于應用程序和原始數據源(例如數據庫、文件系統或遠程 Web 服務)之間的高速存儲層。
當應用程序請求數據時,首先在緩存中檢查數據。如果在緩存中找到數據,則將其返回給應用程序。
如果在緩存中找不到數據,則從其原始來源檢索數據,將其存儲在緩存中以備將來使用,然后返回給應用程序。
在分布式系統中,緩存可以在多個地方完成,例如,客戶端、DNS、CDN、負載均衡器、API 網關、服務器、數據庫等。
7.數據分區
在數據庫中,水平分區(也稱為分片)涉及將表的行劃分為更小的表并將它們存儲在不同的服務器或數據庫實例上。這樣做是為了在多個服務器之間分配數據庫的負載并提高性能。
另一方面,垂直分區涉及將表的列劃分為單獨的表。這樣做是為了減少表中的列數并提高僅訪問少量列的查詢的性能。
8. 數據庫復制
數據庫復制是一種用于跨不同服務器或位置維護同一數據庫的多個副本的技術。
數據庫復制的主要目的是提高數據可用性、冗余性和容錯性,確保系統即使在硬件故障或其他問題的情況下也能繼續運行。
在復制數據庫設置中,一臺服務器充當主(或主)數據庫,而其他服務器充當副本(或從屬)。該過程涉及在主數據庫和副本之間同步數據,因此它們都具有相同的最新信息。
數據庫復制有幾個好處,包括:
- 改進的性能:通過在多個副本之間分配讀取查詢,可以減少主數據庫的負載并縮短查詢響應時間。
- 高可用性:如果主數據庫發生故障或停機,副本可以繼續提供數據,確保對應用程序的訪問不間斷。
- 增強的數據保護:在不同位置擁有多個數據庫副本有助于防止由于硬件故障或其他災難導致的數據丟失。
- 負載平衡:副本可以處理讀取查詢,這樣可以更好地分配負載并減少主數據庫的整體壓力。
9.分布式消息系統
分布式消息傳遞系統支持以可靠、可擴展和容錯的方式在多個可能在地理上分散的應用程序、服務或組件之間交換消息。
它們通過解耦發送方和接收方組件來促進通信,使它們能夠獨立發展和運行。分布式消息系統在大規模或復雜系統中特別有用,例如微服務架構或分布式計算環境中的系統。此類系統的示例有 Apache Kafka 和 RabbitMQ。
10.微服務
微服務是一種架構風格,其中應用程序被構造為小型、松散耦合且可獨立部署的服務的集合。
每個微服務負責應用程序中的特定功能或域,并通過定義明確的 API 與其他微服務進行通信。
這種方法與傳統的單體架構不同,在傳統單體架構中,應用程序被構建為一個緊密耦合的單元。
微服務的主要特點是:
- 單一職責:每個微服務都專注于特定的功能或領域,遵循單一職責原則。這使服務更易于理解、開發和維護。
- 獨立性:微服務可以相互獨立地開發、部署和擴展。這可以提高開發過程的靈活性和敏捷性,因為團隊可以同時處理不同的服務,而不會影響整個系統。
- 去中心化:微服務通常是去中心化的,每個服務都擁有自己的數據和業務邏輯。這鼓勵關注點分離,并使團隊能夠做出決策并選擇最適合其特定需求的技術。
- 通信:微服務使用輕量級協議(例如 HTTP/REST、gRPC 或消息隊列)相互通信。這促進了互操作性,并使集成新服務或替換現有服務變得更加容易。
- 容錯性:由于微服務是獨立的,一個服務出現故障并不一定會導致整個系統出現故障。這有助于提高應用程序的整體彈性。
11. NoSQL 數據庫
NoSQL 數據庫或“Not Only SQL”數據庫是非關系數據庫,旨在存儲、管理和檢索非結構化或半結構化數據。
它們為依賴結構化數據和預定義模式的傳統關系數據庫提供了替代方案。NoSQL 數據庫因其靈活性、可擴展性和處理大量數據的能力而變得流行,使它們非常適合現代應用程序、大數據處理和實時分析。
NoSQL 數據庫可以分為四種主要類型:
- 基于文檔:這些數據庫將數據存儲在類似文檔的結構中,例如 JSON 或 BSON。
每個文檔都是獨立的,可以有自己獨特的結構,使它們適合處理異構數據。基于文檔的 NoSQL 數據庫的示例包括 MongoDB 和 Couchbase。 - 鍵值對:這些數據庫將數據存儲為鍵值對,其中鍵充當唯一標識符,值保存關聯數據。
鍵值數據庫對于簡單的讀寫操作非常高效,并且可以輕松地進行分區和水平擴展。鍵值 NoSQL 數據庫的示例包括 Redis 和 Amazon DynamoDB。 - 列族:這些數據庫將數據存儲在列族中,列族是相關列的組。它們旨在處理寫入繁重的工作負載,并且對于使用已知行鍵和列鍵查詢數據非常高效。列族 NoSQL 數據庫的示例包括 Apache Cassandra 和 HBase。
- 基于圖形:這些數據庫旨在存儲和查詢具有復雜關系和互連結構的數據,例如社交網絡或推薦系統。圖數據庫使用節點、邊和屬性來表示和存儲數據,從而更容易執行復雜的遍歷和基于關系的查詢。基于圖形的 NoSQL 數據庫的示例包括 Neo4j 和 Amazon Neptune。
12.數據庫索引
數據庫索引是提高數據庫查詢操作速度和效率的數據結構。它們的工作方式類似于書中的索引,允許數據庫管理系統 (DBMS) 快速定位與特定值或值集關聯的數據,而無需搜索表中的每一行。
通過為所需數據提供更直接的路徑,索引可以顯著減少從數據庫檢索信息所需的時間。
索引通常建立在數據庫表的一個或多個列上。最常見的索引類型是 B 樹索引,它以分層樹結構組織數據,允許快速搜索、插入和刪除操作。
還有其他類型的索引,例如位圖索引和哈希索引,每種索引都有其特定的用例和優勢。
雖然索引可以顯著提高查詢性能,但它們也有一些折衷:
- 存儲空間:索引會消耗額外的存儲空間,因為它們會在原始表數據旁邊創建和維護單獨的數據結構。
- 寫入性能:當在表中插入、更新或刪除數據時,關聯的索引也必須更新,這會減慢寫入操作。
13.分布式文件系統
分布式文件系統是存儲解決方案,旨在管理和提供對通常分布在網絡上的多個服務器、節點或機器的文件和目錄的訪問。
它們使用戶和應用程序能夠像存儲在本地文件系統上一樣訪問和操作文件,即使實際文件可能物理存儲在多個遠程服務器上。
分布式文件系統通常用于大規模或分布式計算環境,以提供容錯、高可用性和改進的性能。
14.通知系統
這些用于向用戶發送通知或警報,例如電子郵件、推送通知或短信。
15. 全文搜索
全文搜索使用戶能夠在應用程序或網站中搜索特定的單詞或短語。當用戶查詢時,應用程序或網站會返回最相關的結果。
為了快速有效地執行此操作,全文搜索依賴于倒排索引,這是一種將單詞或短語映射到它們出現的文檔的數據結構。
此類系統的一個示例是 Elastic Search。
16.分布式協調服務
分布式協調服務是旨在以可靠、高效和容錯的方式管理和協調分布式應用程序、服務或節點的活動的系統。
它們有助于維護一致性、處理分布式同步以及管理分布式環境中各種組件的配置和狀態。
分布式協調服務在大規模或復雜系統中特別有用,例如微服務架構、分布式計算環境或集群數據庫中的系統。
此類服務的示例有 Apache ZooKeeper、etcd、Consul。
結論
通過使用上述系統設計概念和模板,最大限度地提高系統設計面試的機會。
希望今天這篇文章內容對你有所幫助,感謝你的閱讀。