內容目錄
Toggle前言
系統元件是系統設計的基本模組塊,它們可以被組合起來,用來建構出複雜的軟體系統。這邊也來複習一下系統設計基本概念,系統設計是軟體工程中的一個重要環節,它涉及到軟體系統的整體架構和設計。一個好的系統設計可以使軟體系統更加可靠、可擴展和易於維護。
當然如果要使用這些元件去設計系統,勢必需先了解到底有哪些設計元件?每個設計元件代表的意義又是什麼?這一篇文章會簡介每一個系統元件,後面的篇章則是會詳細講解每一個元件的細節以及應用。
為何要使用系統元件?
通常系統設計問題,會有一些相似的地方,但細節往往是不一樣。 因此我們將這些跨系統設計問題相似的地方使用系統元件來處理。 例如:負載平衡器就是一個常見的系統元件,如果遇到需要負載平衡的地方,直接使用該元件就好。
將系統元件透過模組化的方式,分離出來的原因,是因為「我們只需要討論它們的功能,不需要討論它們的實作」,這也是前篇章節提到的「抽象」的概念。 這樣也有另一個好處,當面試官希望我們針對某個部分進行優化的時候,我們只需要針對特定的系統元件去說明如何優化,而不需要考慮其他系統元件。
系統設計常見的系統元件,也可以在知名的公共雲服務中實際使用,例如: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月,因此本文所撰寫的系統元件則是以當前,所知道的為主要撰寫內容,未來幾篇文章也會以這些系統元件去做介紹。
希望大家會喜歡這樣的內容!