System Design: 系統架構基礎 - 什麼是系統架構

Charlie Lee
Bucketing
Published in
Mar 21, 2021
Photo by carlos aranda on Unsplash

簡介

此篇文章會簡短的介紹甚麼是系統架構,包含組合概念、抽象概念以及設計系統架構的目的。

什麼是系統

系統在生活中無處不見,軟體運作可以稱為系統,工廠流水線之間也可以稱為系統,甚至一個人的生活方式也有自己的系統,這篇文章主要就是定義軟體系統這個詞的概念,包含基礎詞彙定義與抽象的定義,當然每個工程師都有不同的想法與見解,這也是軟體系統設計有很多討論的原因。

組合概念

  • 系統 (System)
  • 子系統 (Sub System)
  • 模組 (Module)
  • 元件 (Component)

這四個詞彙在Computer Science領域使用的非常廣泛,會出現在程式物件層面的設計、分散式層面的設計、作業系統層面甚至是晶片設計,不管在哪裡出現這些詞彙主要表達的就是由小到大的組合關聯。

就已Medium為例,Medium是一個文章平台,它的整體就是一個系統,其中包含會員子系統、文章閱讀系統、文章創作系統,而會員子系統包含登入模組、基本資料模組、文章管理模組,登入模組又會包含密碼加密元件、密碼驗證元件。

四個詞彙整體就在表達階層與組織的概念,如同下圖。

在軟體系統架構裡,這四個詞彙可以用來形容物件之間的關係,也可以用來形容分散式群集之間的關係。

抽象概念

  • 關聯
  • 規則
  • 能力

由剛剛的階層詞彙介紹就可以將這些詞彙提煉出更廣域的抽象概念,系統就是由創造者根據自己的目標找出相關聯的個能力的個體,透過自己設計的規則進行運作。

以Medium登入模組為例子,登入模組需要幫使用者輸入的密碼加密後傳輸,再與資料庫中的密碼進行比對,這時就可以使用與目標有關聯的加密與驗證元件透過先加密後驗證的規則運作。

再看一下DDIA書中第一章節的範例

Designing Data-Intensive Applications: Figure 1–1. One possible architecture for a data system that combines several components.

很單純的軟體系統架構,其中包含了In-memory cache、Primary database、Full-text index、Message queue與三個Application Code

主要Applicatoin Code因為需要儲存使用者資訊所以需要資料庫,
而為了讓資料庫減輕壓力與加快Application響應速度,所以需要依賴下方的關聯模組協作

  • 減輕資料庫(Primary Database)的負擔與加快響應,使用In-memory cache減少查詢
  • 關聯式資料庫不大適合全文搜索(從單個欄位內容找出對應的資訊),使用Full-text index協助搜尋
  • 為了讓三個資料相關的模組運作順暢,撰寫對應處理資料的Applicatoin Code。

而對於減輕主要業務邏輯負擔則是將不需即時處理的任務透過MQ解偶和交給另一個Application Code執行。

什麼是系統架構? 和框架的差別?

上面的介紹已經了解階層與這些階層如何協作的概念,而架構設計就是如何定義這些階層的大小,以及如何處理這些抽象協作,架構設計真的是需要上過戰場並且處理過大大小小的危機,才能有自己的一套設計方法,不過好險現在龍頭公司都有自己的Tech Blog分享資訊,而且書籍上都有許多經驗談,透過自我學習應該有一天也是可以當上架構師?

架構如同之前所說,如何定義與處理抽象的協作,而框架像是Spring MVC/WebFlux則是所謂的規範,使用一個框架代表需要整個團隊依循這框架去開發,這也間接代表廣義程度每個成員都會遵循一定的規則去實作自己的功能,當程式碼都有一定型式時則對整體系統要做變動或是擴增就比混沌的程式碼容易許多。

系統架構的目的

先從工程師A創業的小故事開始,A使用下班時間開發股票爬蟲程式,再一次聚會中和B工程師討論起這個程式應用,B覺得大有搞頭應該將此商業化,因為人數比較少而且只能透過下班時間開發,所以每個功能幾乎都是功能為主沒有思考太多延續的問題。

這個股票爬蟲程式慢慢變成股票論壇,擁有會員功能、討論功能、股票瀏覽功能,再過一陣子A和B想透過購買股票分析資訊的行為來賺錢所以開始開發分析功能,可是使用者越來越多一開始土炮的機器與軟體設計讓原本的系統每三天就會崩潰一次,最重要的是要賺錢的核心分析股票功能,因為原本的程式碼混沌的架構讓此功能根本無法整合。透過介紹C工程師大神來了,開始做一系列的設計包含

  • 如何平滑的增加效能與業務功能
  • 如何減少系統崩潰
  • 如何在系統崩潰時快速回復,甚至是讓使用者感受不到有機器壞掉或是BUG的出現

這一系列的改變就是架構設計,架構設計就是想出一套方案讓系統可以因應不同的目標做出靈活的變動,簡化整個故事與流程,一個好的架構設計就代表著:在未來效能和功能不斷變動的前提下,保持

  • 可靠性 (Reliability)
  • 可擴展性 (Scalability)
  • 可維護性 (Maintainability)

結語

組合概念:

  • System/SubSystem/Module/Component/Framework

抽象概念:

  • 關聯/能力/規則

系統架構的目的:

  • 在未來效能與功能變動的前提下,保持可靠性 (Reliability)、可擴展性 (Scalability)、可維護性 (Maintainability)。

這篇文章非常的高空炮,甚至看完會有種我到底看了甚麼的感覺,但是因為是系列文的第一篇所以就像是每本書的Introduction一種儀式的開端,下一篇文章會介紹架構設計的目的可靠性 (Reliability)、可擴展性 (Scalability)、可維護性 (Maintainability)。

--

--