16個(gè)系統(tǒng)設(shè)計(jì)中的核心概念
系統(tǒng)設(shè)計(jì)是計(jì)算機(jī)科學(xué)技術(shù)領(lǐng)域的重要主題。在系統(tǒng)設(shè)計(jì)中,對(duì)于負(fù)載均衡、緩存、分區(qū)、復(fù)制、數(shù)據(jù)庫和代理等基本設(shè)計(jì)概念的深入理解是十分重要和必要的。這些概念是系統(tǒng)設(shè)計(jì)的關(guān)鍵要素,對(duì)于設(shè)計(jì)高質(zhì)量的系統(tǒng)和應(yīng)對(duì)各種挑戰(zhàn)至關(guān)重要。通過掌握理解這些基本思想,對(duì)于提升設(shè)計(jì)水平和獲取更好的設(shè)計(jì)成果非常有幫助。
本文介紹16個(gè)基本的系統(tǒng)設(shè)計(jì)概念。
1 域名系統(tǒng)(DNS,Domain Name System )
域名系統(tǒng)(DNS)是互聯(lián)網(wǎng)基礎(chǔ)架構(gòu)的核心組成部分,將人類友好的域名轉(zhuǎn)換為相應(yīng)的IP地址。它的功能類似于互聯(lián)網(wǎng)的電話簿,允許用戶通過鍵入易于記憶的域名(如www.designgurus.io)而不是計(jì)算機(jī)用于相互識(shí)別的數(shù)字IP地址(如“192.0.2.1”)來訪問網(wǎng)站和服務(wù)。
當(dāng)在網(wǎng)絡(luò)瀏覽器中輸入一個(gè)域名時(shí),DNS負(fù)責(zé)查找相關(guān)的IP地址并將您的請(qǐng)求引導(dǎo)到正確的服務(wù)器。該過程始于您的計(jì)算機(jī)向遞歸解析器發(fā)送查詢請(qǐng)求,然后遞歸解析器搜索一系列的DNS服務(wù)器,從根服務(wù)器開始,然后是頂級(jí)域(TLD)服務(wù)器,最后是權(quán)威名稱服務(wù)器。一旦找到IP地址,遞歸解析器將其返回給您的計(jì)算機(jī),使您的瀏覽器能夠與目標(biāo)服務(wù)器建立連接并訪問所需的內(nèi)容。
2 負(fù)載均衡器(Load Balancer)
負(fù)載均衡器是一種網(wǎng)絡(luò)設(shè)備或軟件,用于將傳入的網(wǎng)絡(luò)流量分配到多個(gè)服務(wù)器,以確保資源的最佳利用、降低延遲并保持高可用性。它在擴(kuò)展應(yīng)用程序和有效管理服務(wù)器工作負(fù)載方面發(fā)揮著至關(guān)重要的作用,特別是在流量突增或請(qǐng)求在服務(wù)器之間分布不均的情況下。
負(fù)載均衡器使用不同的算法來確定如何分配傳入的流量。常見的算法包括:
- 輪詢:請(qǐng)求按照順序循環(huán)地均勻分布到所有可用服務(wù)器上。
- 最少連接:負(fù)載均衡器將請(qǐng)求分配給活動(dòng)連接最少的服務(wù)器,優(yōu)先選擇負(fù)載較輕的服務(wù)器。
- IP 哈希:客戶端的 IP 地址經(jīng)過哈希計(jì)算,得到的值用于確定請(qǐng)求應(yīng)該發(fā)送到哪個(gè)服務(wù)器。這種方法可以確保特定客戶端的請(qǐng)求始終被路由到同一臺(tái)服務(wù)器上,有助于維持會(huì)話持久性。
圖片
3 API 網(wǎng)關(guān)(API Gateway)
API 網(wǎng)關(guān)是一個(gè)服務(wù)器或服務(wù),充當(dāng)外部客戶端與應(yīng)用程序內(nèi)部微服務(wù)或基于 API 的后端服務(wù)之間的中間人。它是現(xiàn)代架構(gòu)中的關(guān)鍵組件,特別適用于基于微服務(wù)的系統(tǒng),可以簡(jiǎn)化通信過程,并為客戶端提供訪問各種服務(wù)的單一入口點(diǎn)。
API 網(wǎng)關(guān)的主要功能包括:
- 請(qǐng)求路由:根據(jù)預(yù)定義的規(guī)則和配置,將來自客戶端的 API 請(qǐng)求定向到適當(dāng)?shù)暮蠖朔?wù)或微服務(wù)。
- 身份驗(yàn)證和授權(quán):API 網(wǎng)關(guān)可以處理用戶的身份驗(yàn)證和授權(quán),確保只有經(jīng)過授權(quán)的客戶端可以訪問服務(wù)。它可以驗(yàn)證 API 密鑰、令牌或其他憑據(jù),然后將請(qǐng)求路由到后端服務(wù)。
- 速率限制和流量控制:為了保護(hù)后端服務(wù)免受過載或?yàn)E用,API 網(wǎng)關(guān)可以根據(jù)預(yù)定義的策略強(qiáng)制執(zhí)行速率限制或?qū)碜钥蛻舳说恼?qǐng)求進(jìn)行流量控制。
- 緩存:為了降低延遲和后端負(fù)載,API 網(wǎng)關(guān)可以緩存頻繁使用的響應(yīng),直接提供給客戶端,而無需查詢后端服務(wù)。
- 請(qǐng)求和響應(yīng)轉(zhuǎn)換:API 網(wǎng)關(guān)可以修改請(qǐng)求和響應(yīng),例如轉(zhuǎn)換數(shù)據(jù)格式、添加或刪除標(biāo)頭,或修改查詢參數(shù),以確??蛻舳伺c服務(wù)之間的兼容性。
圖片
4 內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN,Content Delivery Network)
內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)是由分布在全球各地的服務(wù)器組成的網(wǎng)絡(luò),用于存儲(chǔ)和傳遞內(nèi)容,如圖片、視頻、樣式表和腳本,以從地理上更接近用戶的位置提供服務(wù)。CDN旨在改善內(nèi)容傳遞到最終用戶的性能、速度和可靠性,無論用戶與源服務(wù)器的位置關(guān)系如何。
CDN的工作原理如下:
- 當(dāng)用戶請(qǐng)求網(wǎng)站或應(yīng)用程序的內(nèi)容時(shí),請(qǐng)求會(huì)被定向到最近的CDN服務(wù)器,也稱為邊緣服務(wù)器。
- 如果邊緣服務(wù)器已經(jīng)緩存了所請(qǐng)求的內(nèi)容,它會(huì)直接向用戶提供內(nèi)容。這樣可以減少延遲并改善用戶體驗(yàn),因?yàn)閮?nèi)容傳輸?shù)木嚯x更短。
- 如果邊緣服務(wù)器上沒有緩存所請(qǐng)求的內(nèi)容,CDN會(huì)從源服務(wù)器或其他附近的CDN服務(wù)器檢索內(nèi)容。一旦獲取到內(nèi)容,它會(huì)被緩存在邊緣服務(wù)器上并提供給用戶。
- 為了確保內(nèi)容保持最新,CDN會(huì)定期檢查源服務(wù)器是否有變更,并相應(yīng)地更新緩存。
圖片
5 正向代理與反向代理(Forward Proxy vs. Reverse Proxy)
正向代理,也稱為“代理服務(wù)器”或簡(jiǎn)稱為“代理”,是位于一個(gè)或多個(gè)客戶機(jī)前面的服務(wù)器,充當(dāng)客戶機(jī)與互聯(lián)網(wǎng)之間的中間人。當(dāng)客戶機(jī)請(qǐng)求互聯(lián)網(wǎng)上的資源時(shí),請(qǐng)求首先發(fā)送到正向代理。正向代理會(huì)代表客戶機(jī)將請(qǐng)求轉(zhuǎn)發(fā)到互聯(lián)網(wǎng),并將響應(yīng)返回給客戶機(jī)。
反向代理是位于一個(gè)或多個(gè)Web服務(wù)器前面的服務(wù)器,充當(dāng)Web服務(wù)器與互聯(lián)網(wǎng)之間的中間人。當(dāng)客戶端請(qǐng)求互聯(lián)網(wǎng)上的資源時(shí),請(qǐng)求首先發(fā)送到反向代理。反向代理將請(qǐng)求轉(zhuǎn)發(fā)給其中一個(gè)Web服務(wù)器,然后將響應(yīng)返回給反向代理。反向代理再將響應(yīng)返回給客戶端。
圖片
6 緩存(Caching)
緩存是位于應(yīng)用程序和數(shù)據(jù)的原始來源(如數(shù)據(jù)庫、文件系統(tǒng)或遠(yuǎn)程Web服務(wù))之間的高速存儲(chǔ)層。當(dāng)應(yīng)用程序請(qǐng)求數(shù)據(jù)時(shí),首先在緩存中進(jìn)行檢查。如果緩存中存在數(shù)據(jù),則將其返回給應(yīng)用程序。如果緩存中不存在數(shù)據(jù),則從原始來源檢索數(shù)據(jù),將其存儲(chǔ)在緩存中供將來使用,并返回給應(yīng)用程序。在分布式系統(tǒng)中,可以在多個(gè)位置進(jìn)行緩存,例如客戶端、DNS、CDN、負(fù)載均衡器、API網(wǎng)關(guān)、服務(wù)器、數(shù)據(jù)庫等。
圖片
7 數(shù)據(jù)分區(qū)(Data Partitioning)
在數(shù)據(jù)庫中,水平分區(qū),也稱為分片(sharding),涉及將表的行分成較小的表,并將它們存儲(chǔ)在不同的服務(wù)器或數(shù)據(jù)庫實(shí)例上。這樣做是為了將數(shù)據(jù)庫的負(fù)載分布到多個(gè)服務(wù)器上,以提高性能。
另一方面,垂直分區(qū)涉及將表的列分成單獨(dú)的表。這樣做是為了減少表中的列數(shù),并提高僅訪問少數(shù)列的查詢的性能。
圖片
8 數(shù)據(jù)庫復(fù)制(Database Replication)
數(shù)據(jù)庫復(fù)制是一種技術(shù),用于在不同的服務(wù)器或位置上維護(hù)同一數(shù)據(jù)庫的多個(gè)副本。數(shù)據(jù)庫復(fù)制的主要目的是提高數(shù)據(jù)的可用性、冗余性和容錯(cuò)性,確保系統(tǒng)在硬件故障或其他問題的情況下繼續(xù)運(yùn)行。
在復(fù)制數(shù)據(jù)庫的設(shè)置中,一個(gè)服務(wù)器充當(dāng)主數(shù)據(jù)庫(或主庫),而其他服務(wù)器則充當(dāng)副本(或從庫)。該過程涉及在主數(shù)據(jù)庫和副本之間同步數(shù)據(jù),以使它們都具有相同的最新信息。數(shù)據(jù)庫復(fù)制提供了多個(gè)優(yōu)點(diǎn),包括:
- 提高性能:通過在多個(gè)副本之間分布讀查詢,可以減輕主數(shù)據(jù)庫的負(fù)載并提高查詢響應(yīng)時(shí)間。
- 高可用性:在主數(shù)據(jù)庫發(fā)生故障或停機(jī)的情況下,副本可以繼續(xù)提供數(shù)據(jù),確保應(yīng)用程序的不間斷訪問。
- 增強(qiáng)數(shù)據(jù)保護(hù):在不同位置擁有數(shù)據(jù)庫的多個(gè)副本有助于防止由于硬件故障或其他災(zāi)難導(dǎo)致的數(shù)據(jù)丟失。
- 負(fù)載均衡:副本可以處理讀查詢,從而實(shí)現(xiàn)更好的負(fù)載分配,減輕主數(shù)據(jù)庫的總體壓力。
9 分布式消息系統(tǒng)(Distributed Messaging Systems)
分布式消息系統(tǒng)能夠在可靠、可擴(kuò)展和容錯(cuò)的方式下,在多個(gè)潛在地理分布的應(yīng)用程序、服務(wù)或組件之間進(jìn)行消息交換。通過解耦發(fā)送者和接收者組件來促進(jìn)通信,使它們能夠獨(dú)立演化和運(yùn)行。分布式消息系統(tǒng)特別適用于大規(guī)模或復(fù)雜的系統(tǒng),例如微服務(wù)架構(gòu)或分布式計(jì)算環(huán)境中的系統(tǒng)。Apache Kafka和RabbitMQ是此類系統(tǒng)的示例。
10 微服務(wù)(Microservices)
微服務(wù)是一種架構(gòu)風(fēng)格,將應(yīng)用程序結(jié)構(gòu)化為一組小型、松耦合和獨(dú)立可部署的服務(wù)。每個(gè)微服務(wù)負(fù)責(zé)應(yīng)用程序中特定的功能或領(lǐng)域,并通過明確定義的API與其他微服務(wù)進(jìn)行通信。這種方法與傳統(tǒng)的單體架構(gòu)不同,傳統(tǒng)單體架構(gòu)將應(yīng)用程序構(gòu)建為單個(gè)緊密耦合的單元。
微服務(wù)的主要特點(diǎn)包括:
- 單一職責(zé):每個(gè)微服務(wù)專注于特定的功能或領(lǐng)域,遵循單一職責(zé)原則。這使得服務(wù)更易于理解、開發(fā)和維護(hù)。
- 獨(dú)立性:微服務(wù)可以獨(dú)立開發(fā)、部署和擴(kuò)展,相互之間沒有依賴。這增加了開發(fā)過程的靈活性和敏捷性,團(tuán)隊(duì)可以同時(shí)處理不同的服務(wù),而不影響整個(gè)系統(tǒng)。
- 去中心化:微服務(wù)通常是去中心化的,每個(gè)服務(wù)擁有自己的數(shù)據(jù)和業(yè)務(wù)邏輯。這鼓勵(lì)關(guān)注點(diǎn)分離,并使團(tuán)隊(duì)能夠根據(jù)自己的特定需求做出決策和選擇技術(shù)。
- 通信:微服務(wù)使用輕量級(jí)的協(xié)議進(jìn)行通信,如HTTP/REST、gRPC或消息隊(duì)列。這促進(jìn)了互操作性,使得容易集成新的服務(wù)或替換現(xiàn)有的服務(wù)。
- 容錯(cuò)性:由于微服務(wù)是獨(dú)立的,一個(gè)服務(wù)的失敗不一定會(huì)導(dǎo)致整個(gè)系統(tǒng)失敗。這有助于提高應(yīng)用程序的整體彈性。
11 NoSQL數(shù)據(jù)庫(NoSQL Databases)
NoSQL數(shù)據(jù)庫(非關(guān)系型數(shù)據(jù)庫)是設(shè)計(jì)用于存儲(chǔ)、管理和檢索非結(jié)構(gòu)化或半結(jié)構(gòu)化數(shù)據(jù)的數(shù)據(jù)庫。它們提供了傳統(tǒng)關(guān)系型數(shù)據(jù)庫的替代方案,傳統(tǒng)關(guān)系型數(shù)據(jù)庫依賴結(jié)構(gòu)化數(shù)據(jù)和預(yù)定義模式。NoSQL數(shù)據(jù)庫因其靈活性、可擴(kuò)展性和處理大量數(shù)據(jù)的能力而受到歡迎,特別適用于現(xiàn)代應(yīng)用、大數(shù)據(jù)處理和實(shí)時(shí)分析。
NoSQL數(shù)據(jù)庫可以分為四種主要類型:
- 基于文檔:這些數(shù)據(jù)庫將數(shù)據(jù)存儲(chǔ)在類似文檔的結(jié)構(gòu)中,如JSON或BSON。每個(gè)文檔是自包含的,可以具有自己獨(dú)特的結(jié)構(gòu),適用于處理異構(gòu)數(shù)據(jù)。例如,MongoDB和Couchbase是基于文檔的NoSQL數(shù)據(jù)庫的示例。
- 鍵值對(duì):這些數(shù)據(jù)庫將數(shù)據(jù)存儲(chǔ)為鍵值對(duì),其中鍵充當(dāng)唯一標(biāo)識(shí)符,值包含相關(guān)數(shù)據(jù)。鍵值對(duì)數(shù)據(jù)庫在簡(jiǎn)單的讀寫操作上非常高效,并且可以容易地進(jìn)行分區(qū)和水平擴(kuò)展。例如,Redis和Amazon DynamoDB是鍵值對(duì)NoSQL數(shù)據(jù)庫的示例。
- 列族:這些數(shù)據(jù)庫將數(shù)據(jù)存儲(chǔ)在列族中,列族是一組相關(guān)列的集合。它們?cè)O(shè)計(jì)用于處理寫入密集型工作負(fù)載,并且對(duì)于查詢具有已知行和列鍵的數(shù)據(jù)非常高效。例如,Apache Cassandra和HBase是列族NoSQL數(shù)據(jù)庫的示例。
- 基于圖:這些數(shù)據(jù)庫設(shè)計(jì)用于存儲(chǔ)和查詢具
12 數(shù)據(jù)庫索引(Database Index)
數(shù)據(jù)庫索引是一種提高數(shù)據(jù)庫查詢操作速度和效率的數(shù)據(jù)結(jié)構(gòu)。工作方式類似于書中的索引,允許數(shù)據(jù)庫管理系統(tǒng)(DBMS)快速定位與特定值或值集相關(guān)聯(lián)的數(shù)據(jù),而無需搜索表中的每一行。通過提供更直接的路徑以獲取所需數(shù)據(jù),索引可以顯著減少從數(shù)據(jù)庫檢索信息所需的時(shí)間。
索引通常建立在一個(gè)或多個(gè)數(shù)據(jù)庫表的列上。最常見的索引類型是B樹索引,它以層次結(jié)構(gòu)的樹形結(jié)構(gòu)組織數(shù)據(jù),實(shí)現(xiàn)快速搜索、插入和刪除操作。還有其他類型的索引,如位圖索引和哈希索引,每種索引都有其特定的用例和優(yōu)勢(shì)。
雖然索引可以顯著提高查詢性能,但也存在一些權(quán)衡:
- 存儲(chǔ)空間:索引占用額外的存儲(chǔ)空間,因?yàn)樗鼈冊(cè)谠急頂?shù)據(jù)旁創(chuàng)建和維護(hù)單獨(dú)的數(shù)據(jù)結(jié)構(gòu)。
- 寫入性能:當(dāng)在表中插入、更新或刪除數(shù)據(jù)時(shí),相關(guān)的索引也必須進(jìn)行更新,這可能會(huì)降低寫入操作的速度。
13 分布式文件系統(tǒng)(Distributed File Systems)
分布式文件系統(tǒng)是設(shè)計(jì)用于管理和提供對(duì)文件和目錄的訪問的存儲(chǔ)解決方案,通常跨多臺(tái)服務(wù)器、節(jié)點(diǎn)或機(jī)器進(jìn)行分布,常常分布在一個(gè)網(wǎng)絡(luò)上。它們使用戶和應(yīng)用程序能夠像在本地文件系統(tǒng)上存儲(chǔ)文件一樣訪問和操作文件,即使實(shí)際文件可能物理上存儲(chǔ)在多個(gè)遠(yuǎn)程服務(wù)器上。分布式文件系統(tǒng)通常用于大規(guī)?;蚍植际接?jì)算環(huán)境中,以提供容錯(cuò)性、高可用性和改進(jìn)的性能。
14 通知系統(tǒng)(Notification System)
通知系統(tǒng)用于向用戶發(fā)送通知或提醒,例如電子郵件、推送通知或短信。
15 全文搜索(Full-text Search)
全文搜索使用戶能夠在應(yīng)用程序或網(wǎng)站中搜索特定的單詞或短語。當(dāng)用戶查詢時(shí),應(yīng)用程序或網(wǎng)站返回最相關(guān)的結(jié)果。為了快速高效地完成這一操作,全文搜索依賴于倒排索引,它是一種將單詞或短語映射到出現(xiàn)它們的文檔的數(shù)據(jù)結(jié)構(gòu)。Elastic Search就是這類系統(tǒng)的一個(gè)例子。
16 分布式協(xié)調(diào)服務(wù)(Distributed Coordination Services)
分布式協(xié)調(diào)服務(wù)是一種設(shè)計(jì)用于可靠、高效和容錯(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ù)庫。Apache ZooKeeper、etcd和Consul是此類服務(wù)的示例。
總結(jié)
通過使用上述系統(tǒng)設(shè)計(jì)概念和模板,能夠最大化在系統(tǒng)設(shè)計(jì)面試中成功的機(jī)會(huì)。以下是一些常見的系統(tǒng)設(shè)計(jì)面試問題列表:
- 設(shè)計(jì)類似Google Drive或Dropbox的文件共享服務(wù)。
- 設(shè)計(jì)視頻流媒體平臺(tái)。
- 設(shè)計(jì)URL縮短服務(wù)。
- 設(shè)計(jì)網(wǎng)絡(luò)爬蟲。
- 設(shè)計(jì)Uber。
- 設(shè)計(jì)Facebook Messenger。
- 設(shè)計(jì)Twitter搜索。
希望本文對(duì)讀者的面試和工作有幫助。