系統設計元件介紹 Building Block – 系統設計 05

system-design-系統設計05-系統設計元件-building-block-hogantech

前言

系統元件是系統設計的基本模組塊,它們可以被組合起來,用來建構出複雜的軟體系統。這邊也來複習一下系統設計基本概念,系統設計是軟體工程中的一個重要環節,它涉及到軟體系統的整體架構和設計。一個好的系統設計可以使軟體系統更加可靠、可擴展和易於維護。

當然如果要使用這些元件去設計系統,勢必需先了解到底有哪些設計元件?每個設計元件代表的意義又是什麼?這一篇文章會簡介每一個系統元件,後面的篇章則是會詳細講解每一個元件的細節以及應用。

為何要使用系統元件?

通常系統設計問題,會有一些相似的地方,但細節往往是不一樣。 因此我們將這些跨系統設計問題相似的地方使用系統元件來處理。 例如:負載平衡器就是一個常見的系統元件,如果遇到需要負載平衡的地方,直接使用該元件就好。

將系統元件透過模組化的方式,分離出來的原因,是因為「我們只需要討論它們的功能,不需要討論它們的實作」,這也是前篇章節提到的「抽象」的概念。 這樣也有另一個好處,當面試官希望我們針對某個部分進行優化的時候,我們只需要針對特定的系統元件去說明如何優化,而不需要考慮其他系統元件。

系統設計常見的系統元件,也可以在知名的公共雲服務中實際使用,例如:Amazon Web Services (AWS)、Azure 和 Google Cloud Platform (GCP)。 上述這些知名的雲服務,通常都會提供相對應的系統元件來提供使用者使用。

系統設計元件 Building Block

在系統設計中,系統元件非常重要,一個系統設計流程除了估算系統設計所需要的資源、效能以外,最重要的就是如何透過現有的系統設計元件,來建構出軟體系統。這邊也列出各種系統元件的簡介,未來的文章中,會再仔細介紹這些系統元件。

網域名稱系統 (DNS)

網域名稱系統 (DNS) 系統元件,著重於如何為通過不同網際網路協議,連接到網際網路的計算機設計分層和分散式命名系統。我們也需要透過DNS來幫我們處理IP以及網域名稱的問題。

負載平衡器 (Load Balancers)

負載平衡器 (Load Balancers) 系統元件中,主要用來將伺服器端的服務請求分配傳入客戶端的請求,還可以減少負載並繞過故障的服務器。白話來說,我們需要針對伺服器以及用戶端的來回請求,進行平衡,避免某特定伺服器因為大量的請求而癱瘓。

資料庫 (Databases)

資料庫 (Databases) 系統元件,是一種關聯式資料庫,使我們能夠儲存、搜索、修改和刪除資料。 接下來的篇章,講解資料庫時,我也會詳細講解哪些情況下適合SQL、哪些情況下適合NoSQL,也會花一些篇幅講解如何優化、備份。

鍵值資料庫 (Key-Value Store)

鍵值資料庫 (Key-Value Store) 是一種非關聯式資料庫,用鍵值的形式儲存資料。 講解此資料庫時,也會解釋鍵值儲存的設計以及實現可擴展性、持久性和可配置性…等等,重要的概念。

內容交付網路 (CDN)

內容交付網路 (CDN) 是一種互連伺服器網路,可加快資料密集型應用程式的網頁載入速度。當使用者造訪網站時,來自該網站伺服器的資料必須透過網際網路傳輸到使用者的電腦中。如果使用者距離該伺服器較遠,則載入大型檔案 (例如影片或網站影像) 會需要很長的時間。相反,存放在 CDN 伺服器上的網站內容在地理位置上靠近使用者,便能更快地到達他們的電腦。使用 CDN 可以有效地將內容交付給最終用戶,同時降低延遲和伺服器的負擔。

順序器 (Sequencer)

在順序器系統元件中,主要著重在如何產生具有唯一性 ID 的生成器,並會花一些篇幅,解釋這些生成器的原理。 那ID生成器是什麼呢?以使用者的編號為例:當任何使用者註冊時,我們會給他對應的使用者編號,這個使用者編號會希望他是獨一無二的,使用者編號不會重複,因此不能隨意產生,需要透過特殊處理才能產生。

服務監控 (Service Monitoring)

監控系統在分散式系統中非常中藥,因為監控系統可以幫助分析系統,並在出現問題時通知工程師、專案經理、客戶。 監控通常是用來預警,以方便系統管理者可以再遇到問題前,提前採取行動,防止即將發生的小問題變成大問題。記住,世界上沒有任何系統是不出錯的,因此我們需要服務監控來去幫我們回報問題。

分散式快取 (Distributed Caching)

所謂的快取,是透過暫時性的儲存資料,來去優化效能。分散式快取系統,會有多個快取服務器協同各類型的儲存機制,來去回傳經常被搜尋的資料,優化系統。

分散式訊息佇列 (Distributed Messaging Queue)

分散式系統佇列是由多個服務器組成的佇列設計,可讓系統的不同部分以非同步方式進行通訊和處理操作,實現軟體系統可擴展性並提高可靠性。

發佈訂閱系統 (Publish-Subscribe System)

發佈、訂閱如同字面上的意思,會由一個發佈者來去做訊息的發布,其他訊息接收者稱為訂閱者。在這個發佈訂閱的規範下,發佈者不用去管訂閱者是誰,只要管發佈就好,而訂閱者也只要管訂閱就好。

限速器 (Rate Limiter)

限速器主要用來限制服務傳入的請求。如果有大流量的請求進來系統,我們可以透過此系統元件,來去做限制流量,慢慢的將請求處理掉,避免系統癱瘓。我們也通常將限速器用作系統服務的防禦層,以避免有意或是無意的高流量訪問。

Blob 儲存 (Blob Store)

「blob」是二進位大型物件的縮寫,是二進位形式的大量資料,不一定符合任何檔案格式。Blob 儲存將這些海量資料保存在稱為「資料湖」的非階層式儲存區域中。白話來說,此元件著重於非結構化資料的儲存方法,例如:多媒體檔案、二進制可執行檔案。

分散式搜尋 (Distributed Search)

搜索系統會從使用者那裡獲取查詢字串,並在幾秒鐘或更短的時間內返回相關內容。要如何有效地在成千上萬比資料中,快速回傳給使用者,就是這個系統元件在做的事行。

分散式記錄 (Distributed Logging)

日誌記錄是一個 I/O 密集型操作,耗時且緩慢。這個元件主要工作是要讓分散式系統服務,有效地記錄其程式執行的紀錄,如果遇到錯誤需要修正時,我們也需要透過這樣的紀錄元件,來去回溯問題發生的過程。

分散式任務排程 (Distributed Task Scheduling)

分散式任務排程主要用於,任務和資源之間進行協調。 它會有效率的將資源分配給任務,以滿足任務級別和系統級別的需求。簡而言之,透過此系統元件,來讓系統可以有效的進行資源、任務的排程與調度。

分散計數器 (Sharded Counters)

計數器顧名思義,就是拿來計算數量的,例如:使用者的觀看數、留言數、點讚數。如果是小規模的系統,只需要透過簡單的程式就可以完成,但如果是大型規模的系統,我們就需要一個高效的分散式計數系統,來處理數百萬個並請求。

結語

這篇文章撰寫於 2024年3月,因此本文所撰寫的系統元件則是以當前,所知道的為主要撰寫內容,未來幾篇文章也會以這些系統元件去做介紹。

希望大家會喜歡這樣的內容!

引用

What is CDN?

相關文章

Back-of-the-envelope 封底計算 – 系統設計 04

軟體設計非功能性特性 – 系統設計 03

抽象在系統設計中的應用 – 系統設計 02

現代系統設計介紹 – 系統設計 01

2023 Yahoo! Software Engineer 軟體工程師面試心得

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

zh_TW繁體中文