要在關(guān)于系統(tǒng)設(shè)計(jì)的面試中脫穎而出,最關(guān)鍵的方面之一是深入理解基本的系統(tǒng)設(shè)計(jì)概念,例如,負(fù)載平衡、緩存、分區(qū)、復(fù)制、數(shù)據(jù)庫(kù)和代理。
根據(jù)我自己的經(jīng)驗(yàn),我確定了 16 個(gè)關(guān)鍵概念,它們可以幫助你提高解決系統(tǒng)設(shè)計(jì)問題的能力。
這些概念的范圍從理解 API 網(wǎng)關(guān)的復(fù)雜性和掌握負(fù)載平衡技術(shù)到掌握 CDN 的重要性和理解緩存在現(xiàn)代分布式系統(tǒng)中的作用。閱讀完本文時(shí),你將全面了解這些基本思想,并有信心在下一次面試中應(yīng)用它們。
系統(tǒng)設(shè)計(jì)面試本質(zhì)上是非結(jié)構(gòu)化的。在面試過程中,很難跟蹤事情并確保你已經(jīng)觸及設(shè)計(jì)的所有基本方面。
為了簡(jiǎn)化這個(gè)過程,我開發(fā)了一個(gè)系統(tǒng)設(shè)計(jì)主模板,可以幫助你回答任何系統(tǒng)設(shè)計(jì)面試問題,深入了解任何系統(tǒng)設(shè)計(jì)中可能涉及的關(guān)鍵組件。
請(qǐng)牢記這個(gè)主模板,我們將討論 16 個(gè)基本系統(tǒng)設(shè)計(jì)概念。
現(xiàn)在我們開始吧。
域名系統(tǒng) (DNS) 是互聯(lián)網(wǎng)基礎(chǔ)設(shè)施的基本組成部分,可將人類友好的域名轉(zhuǎn)換為相應(yīng)的 IP 地址。
它的功能類似于 Internet 電話簿,允許用戶通過鍵入易于記憶的域名(例如 www.google.com)而不是計(jì)算機(jī)用來相互識(shí)別的數(shù)字 IP 地址(例如“192.168.2.1”)來訪問網(wǎng)站和服務(wù)。
當(dāng)你在 Web 瀏覽器中輸入域名時(shí),DNS 負(fù)責(zé)查找關(guān)聯(lián)的 IP 地址并將你的請(qǐng)求定向到正確的服務(wù)器。
該過程從你的計(jì)算機(jī)向遞歸解析器發(fā)送查詢開始,然后搜索一系列 DNS 服務(wù)器,從根服務(wù)器開始,然后是頂級(jí)域 (TLD) 服務(wù)器,最后是權(quán)威名稱服務(wù)器。
找到 IP 地址后,遞歸解析器會(huì)將其返回到你的計(jì)算機(jī),讓你的瀏覽器與目標(biāo)服務(wù)器建立連接并訪問所需的內(nèi)容。
負(fù)載均衡器是一種網(wǎng)絡(luò)設(shè)備或軟件,可在多個(gè)服務(wù)器之間分配傳入的網(wǎng)絡(luò)流量,以確保最佳的資源利用率、減少延遲并保持高可用性。
它在擴(kuò)展應(yīng)用程序和有效管理服務(wù)器工作負(fù)載方面起著至關(guān)重要的作用,尤其是在流量突然激增或服務(wù)器之間請(qǐng)求分布不均的情況下。
負(fù)載均衡器使用不同的算法來確定如何分配傳入流量。
常見的算法包括:
API 網(wǎng)關(guān)是一種服務(wù)器或服務(wù),充當(dāng)外部客戶端與應(yīng)用程序的內(nèi)部微服務(wù)或基于 API 的后端服務(wù)之間的中介。它是現(xiàn)代架構(gòu)中的一個(gè)重要組件,尤其是在基于微服務(wù)的系統(tǒng)中,它簡(jiǎn)化了通信過程并為客戶端提供了訪問各種服務(wù)的單一入口點(diǎn)。
API網(wǎng)關(guān)的主要功能包括:
內(nèi)容分發(fā)網(wǎng)絡(luò) (CDN) 是一種分布式服務(wù)器網(wǎng)絡(luò),用于存儲(chǔ)圖像、視頻、樣式表和腳本等內(nèi)容并將其分發(fā)給地理位置較近的用戶。CDN 旨在提高向最終用戶交付內(nèi)容的性能、速度和可靠性,無論他們相對(duì)于原始服務(wù)器的位置如何。
CDN 的工作原理如下:
轉(zhuǎn)發(fā)代理,也稱為“代理服務(wù)器”或簡(jiǎn)稱為“代理”,是位于一臺(tái)或多臺(tái)客戶端計(jì)算機(jī)前面并充當(dāng)客戶端和 Internet 之間的中介的服務(wù)器。
當(dāng)客戶端機(jī)器向 Internet 上的資源發(fā)出請(qǐng)求時(shí),該請(qǐng)求首先被發(fā)送到轉(zhuǎn)發(fā)代理。然后,轉(zhuǎn)發(fā)代理代表客戶端將請(qǐng)求轉(zhuǎn)發(fā)到 Internet,并將響應(yīng)返回給客戶端。
反向代理是位于一個(gè)或多個(gè) Web 服務(wù)器之前的服務(wù)器,充當(dāng) Web 服務(wù)器和 Internet 之間的中介。
當(dāng)客戶端向 Internet 上的資源發(fā)出請(qǐng)求時(shí),該請(qǐng)求首先被發(fā)送到反向代理。
然后反向代理將請(qǐng)求轉(zhuǎn)發(fā)到其中一個(gè) Web 服務(wù)器,該服務(wù)器將響應(yīng)返回給反向代理。然后反向代理將響應(yīng)返回給客戶端。
緩存是位于應(yīng)用程序和原始數(shù)據(jù)源(例如數(shù)據(jù)庫(kù)、文件系統(tǒng)或遠(yuǎn)程 Web 服務(wù))之間的高速存儲(chǔ)層。
當(dāng)應(yīng)用程序請(qǐng)求數(shù)據(jù)時(shí),首先在緩存中檢查數(shù)據(jù)。如果在緩存中找到數(shù)據(jù),則將其返回給應(yīng)用程序。
如果在緩存中找不到數(shù)據(jù),則從其原始來源檢索數(shù)據(jù),將其存儲(chǔ)在緩存中以備將來使用,然后返回給應(yīng)用程序。
在分布式系統(tǒng)中,緩存可以在多個(gè)地方完成,例如,客戶端、DNS、CDN、負(fù)載均衡器、API 網(wǎng)關(guān)、服務(wù)器、數(shù)據(jù)庫(kù)等。
在數(shù)據(jù)庫(kù)中,水平分區(qū)(也稱為分片)涉及將表的行劃分為更小的表并將它們存儲(chǔ)在不同的服務(wù)器或數(shù)據(jù)庫(kù)實(shí)例上。這樣做是為了在多個(gè)服務(wù)器之間分配數(shù)據(jù)庫(kù)的負(fù)載并提高性能。
另一方面,垂直分區(qū)涉及將表的列劃分為單獨(dú)的表。這樣做是為了減少表中的列數(shù)并提高僅訪問少量列的查詢的性能。
數(shù)據(jù)庫(kù)復(fù)制是一種用于跨不同服務(wù)器或位置維護(hù)同一數(shù)據(jù)庫(kù)的多個(gè)副本的技術(shù)。
數(shù)據(jù)庫(kù)復(fù)制的主要目的是提高數(shù)據(jù)可用性、冗余性和容錯(cuò)性,確保系統(tǒng)即使在硬件故障或其他問題的情況下也能繼續(xù)運(yùn)行。
在復(fù)制數(shù)據(jù)庫(kù)設(shè)置中,一臺(tái)服務(wù)器充當(dāng)主(或主)數(shù)據(jù)庫(kù),而其他服務(wù)器充當(dāng)副本(或從屬)。該過程涉及在主數(shù)據(jù)庫(kù)和副本之間同步數(shù)據(jù),因此它們都具有相同的最新信息。
數(shù)據(jù)庫(kù)復(fù)制有幾個(gè)好處,包括:
分布式消息傳遞系統(tǒng)支持以可靠、可擴(kuò)展和容錯(cuò)的方式在多個(gè)可能在地理上分散的應(yīng)用程序、服務(wù)或組件之間交換消息。
它們通過解耦發(fā)送方和接收方組件來促進(jìn)通信,使它們能夠獨(dú)立發(fā)展和運(yùn)行。分布式消息系統(tǒng)在大規(guī)模或復(fù)雜系統(tǒng)中特別有用,例如微服務(wù)架構(gòu)或分布式計(jì)算環(huán)境中的系統(tǒng)。此類系統(tǒng)的示例有 Apache Kafka 和 RabbitMQ。
微服務(wù)是一種架構(gòu)風(fēng)格,其中應(yīng)用程序被構(gòu)造為小型、松散耦合且可獨(dú)立部署的服務(wù)的集合。
每個(gè)微服務(wù)負(fù)責(zé)應(yīng)用程序中的特定功能或域,并通過定義明確的 API 與其他微服務(wù)進(jìn)行通信。
這種方法與傳統(tǒng)的單體架構(gòu)不同,在傳統(tǒng)單體架構(gòu)中,應(yīng)用程序被構(gòu)建為一個(gè)緊密耦合的單元。
微服務(wù)的主要特點(diǎn)是:
NoSQL 數(shù)據(jù)庫(kù)或“Not Only SQL”數(shù)據(jù)庫(kù)是非關(guān)系數(shù)據(jù)庫(kù),旨在存儲(chǔ)、管理和檢索非結(jié)構(gòu)化或半結(jié)構(gòu)化數(shù)據(jù)。
它們?yōu)橐蕾嚱Y(jié)構(gòu)化數(shù)據(jù)和預(yù)定義模式的傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)提供了替代方案。NoSQL 數(shù)據(jù)庫(kù)因其靈活性、可擴(kuò)展性和處理大量數(shù)據(jù)的能力而變得流行,使它們非常適合現(xiàn)代應(yīng)用程序、大數(shù)據(jù)處理和實(shí)時(shí)分析。
NoSQL 數(shù)據(jù)庫(kù)可以分為四種主要類型:
數(shù)據(jù)庫(kù)索引是提高數(shù)據(jù)庫(kù)查詢操作速度和效率的數(shù)據(jù)結(jié)構(gòu)。它們的工作方式類似于書中的索引,允許數(shù)據(jù)庫(kù)管理系統(tǒng) (DBMS) 快速定位與特定值或值集關(guān)聯(lián)的數(shù)據(jù),而無需搜索表中的每一行。
通過為所需數(shù)據(jù)提供更直接的路徑,索引可以顯著減少?gòu)臄?shù)據(jù)庫(kù)檢索信息所需的時(shí)間。
索引通常建立在數(shù)據(jù)庫(kù)表的一個(gè)或多個(gè)列上。最常見的索引類型是 B 樹索引,它以分層樹結(jié)構(gòu)組織數(shù)據(jù),允許快速搜索、插入和刪除操作。
還有其他類型的索引,例如位圖索引和哈希索引,每種索引都有其特定的用例和優(yōu)勢(shì)。
雖然索引可以顯著提高查詢性能,但它們也有一些折衷:
分布式文件系統(tǒng)是存儲(chǔ)解決方案,旨在管理和提供對(duì)通常分布在網(wǎng)絡(luò)上的多個(gè)服務(wù)器、節(jié)點(diǎn)或機(jī)器的文件和目錄的訪問。
它們使用戶和應(yīng)用程序能夠像存儲(chǔ)在本地文件系統(tǒng)上一樣訪問和操作文件,即使實(shí)際文件可能物理存儲(chǔ)在多個(gè)遠(yuǎn)程服務(wù)器上。
分布式文件系統(tǒng)通常用于大規(guī)模或分布式計(jì)算環(huán)境,以提供容錯(cuò)、高可用性和改進(jìn)的性能。
這些用于向用戶發(fā)送通知或警報(bào),例如電子郵件、推送通知或短信。
全文搜索使用戶能夠在應(yīng)用程序或網(wǎng)站中搜索特定的單詞或短語。當(dāng)用戶查詢時(shí),應(yīng)用程序或網(wǎng)站會(huì)返回最相關(guān)的結(jié)果。
為了快速有效地執(zhí)行此操作,全文搜索依賴于倒排索引,這是一種將單詞或短語映射到它們出現(xiàn)的文檔的數(shù)據(jù)結(jié)構(gòu)。
此類系統(tǒng)的一個(gè)示例是 Elastic Search。
分布式協(xié)調(diào)服務(wù)是旨在以可靠、高效和容錯(cuò)的方式管理和協(xié)調(diào)分布式應(yīng)用程序、服務(wù)或節(jié)點(diǎn)的活動(dòng)的系統(tǒng)。
它們有助于維護(hù)一致性、處理分布式同步以及管理分布式環(huán)境中各種組件的配置和狀態(tài)。
分布式協(xié)調(diào)服務(wù)在大規(guī)模或復(fù)雜系統(tǒng)中特別有用,例如微服務(wù)架構(gòu)、分布式計(jì)算環(huán)境或集群數(shù)據(jù)庫(kù)中的系統(tǒng)。
此類服務(wù)的示例有 Apache ZooKeeper、etcd、Consul。
通過使用上述系統(tǒng)設(shè)計(jì)概念和模板,最大限度地提高系統(tǒng)設(shè)計(jì)面試的機(jī)會(huì)。
希望今天這篇文章內(nèi)容對(duì)你有所幫助,感謝你的閱讀。
本文鏈接:http://www.tebozhan.com/showinfo-26-87000-0.html16 個(gè)在面試前需要知道的系統(tǒng)設(shè)計(jì)概念
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com