iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
Software Development

軟體架構備忘錄系列 第 3

Day 3 基本概念 - 軟體架構屬性 (知識點008~013)

  • 分享至 

  • xImage
  •  

好的架構會有那些屬性呢?這些屬性也許感覺和架構設計目標有點像,但是會需要考慮這些屬性的原因,其實是為了達到架構設計的目標。例如說,伸縮性與容錯性都是為了使此架構成為一個高可靠的系統。

常見的軟體架構屬性包含:伸縮性、高容錯、易用性、低耦合、可移植性、可重用性

伸縮性

描述

由於系統使用量的多變化性,架構設計會考慮其各項需求伸縮的容易度。易於伸縮的系統可依照需求即時調整。在系統需求量高時,增加資源以快速消化需求。在系統需求量低時,減少資源以節約成本。在系統的各方面都需要考慮伸縮性,包含計算、檔案讀寫、資料庫讀寫、網路流量等。

常用作法

  • 需求量規劃:按照目前使用量,預測未來增長、及特殊事件下的需求量,以決定系統伸縮設計方式
  • 垂直伸縮:在單一伺服器上增加更多系統資源。伸縮速度較慢,伸縮彈性較小。
  • 水平伸縮:伸縮至多台伺服器。伸縮速度較快,伸縮彈性大。
  • 自動伸縮:動態偵測系統需求量,自動進行伸縮。

高容錯

描述

高容錯的架構可以避免單點故障造成系統無法使用或出現重大錯誤。

可能作法

  • 冗餘設計:通過使用冗餘的組件或服務來增加系統的可靠性,以防止單一點故障。這包括使用備援伺服器、備援網路連接、備援數據存儲等。然而,需要注意冗餘設計會增加成本和複雜性。
  • 錯誤偵測和恢復:實施錯誤偵測機制,以及自動化的錯誤恢復策略。這可以包括使用監控系統和健康檢查來檢測故障,並自動將流量轉移到正常運行的組件上。這有助於快速檢測和恢復系統中的錯誤,降低故障對系統的影響。
  • 快速恢復:在發生故障後,能夠快速恢復系統的正常運行。這包括快速故障轉移、快速故障排除和快速故障恢復策略的實施。快速恢復能夠最小化服務中斷的時間,提高系統的可用性。
  • 容錯測試與演練:藉由定期測試系統的容錯能力,可確認目前架構可應對單元故障之風險。

易用性

描述

系統設計時應該盡可能易於使用以減少不熟悉的使用者初次使用時的挫折感,並減少操作的多餘動作。這有助於吸引更多客群並帶來更多利潤。

可能做法

  • 設計易於上手的UX:通過良好的UX設計,可以幫助使用者快速上手,並增進使用的效率。包括直觀的界面設計、一致的操作流程和清晰的指導。
  • 減少應用程式的大小及網路需求:應該努力減少應用程式的大小,以提高下載速度和運行效率。同時,減少網路需求可以降低用戶在使用過程中遇到的延遲和不穩定性。
  • 考慮無障礙設計:除了普通用戶外,還應該關注身體機能有差異的用戶。遵循無障礙設計原則,例如提供可讀性高的文字、明確的標籤和鍵盤導航,以確保所有用戶都能輕鬆訪問和使用系統。
  • 多國語系的使用者介面:考慮不同區域的用戶,提供多語言的使用者介面可以提升他們的使用體驗。這樣的設計可以減少語言障礙並確保全球用戶能夠輕鬆理解和操作系統。

低耦合

描述

系統的低耦合性指的是模組之間的相互依賴程度低。在大型系統中,通常會根據功能性質將系統拆分為多個模組,例如訂單模組、使用者資訊模組等。儘管這些模組可能需要相互協作,但為了更好地管理模組,應該減少模組之間的直接相依性。這樣可以避免耦合度過高,從而使各模組更容易進行變更,因為一旦進行變更可能對其他模組產生重大影響。

不同種類的耦合方式(從低到高排列):

  • 內容耦合:直接讀取另一模組的內部資料,例如直接使用變數,或是直接讀取另一模組的資料表。
  • 外部耦合:兩個模組都讀寫一個全域的資料位置。
  • 控制耦合:提供接口給對方模組,讓B模組使用此接口控制A模組,封裝自己的資料和流程。
  • 訊息耦合:提供外部訊息介面供呼叫,例如通過Web API進行呼叫。

可能的做法:

  • 解耦資料存取:將資料存取和流程控制與內部資料、特定資料庫解耦,以提高系統的靈活性。
  • 依賴反轉:高階模組使用元件時,元件只需指定回傳的介面,而非具體的類別,以減少程式之間的耦合度。
  • 事件驅動:使用事件或訊息傳遞方式進行模組之間的呼叫,甚至可以透過非同步事件處理機制進一步降低耦合度。

可移植性

描述

開發應用程式時應考慮可移植性,因為同樣的商業邏輯未來可能要在不同環境下執行。例如,本來是網頁後端伺服器須執行此邏輯,後來需要在Batch或排程作業中也要可以執行此邏輯。讓應用程式可移植性高,未來轉移環境時可減少修改的幅度。

常見作法

  • 使用可執行於多環境的程式語言,例如 Java、Golang:這樣的程式語言具有跨平台的特性,可以在不同作業系統和環境中執行,提高應用程式的可移植性。
  • 將與外部交互的接口使用介面獨立成可抽換元件,未來只需抽換接口實作即可:這種做法可以將與外部系統的依賴降低到最低,當需要轉移環境或更換外部系統時,只需實作新的接口即可,不需修改大量程式碼。
  • 程式模組化,避免高耦合的程式,造成程式難以調整架構:模組化的程式設計可以將功能拆分為獨立的模組,降低模組之間的相依性,使得模組可以獨立調整和替換,提高可移植性。

可重用性

描述

在軟體開發過程中,強調將相似或重複的元件從程式碼中抽離,以減少重複編寫程式碼的情況。

優點

  • 降低開發時間: 透過抽離共通元件,程式開發人員可以在後續開發中直接使用這些共用的元件,節省了開發重複功能的時間和精力。
  • 增進程式可理解度: 將共用元件分離後,每個程式將專注於其特有的功能邏輯,這有助於程式碼的可讀性和維護性,使未來的修改和維護更加容易。
  • 減少功能調整時間: 由於共通元件負責處理共用的功能,當功能變更時,僅需在共用元件進行調整,而不需在多處程式碼中進行修改,因此減少了功能調整所需的時間。

衡量因素

  • 提供適切的呼叫介面: 共用元件的呼叫介面應該易於使用和理解,以減少使用程式的困擾。良好的介面設計能夠降低使用元件的學習曲線。
  • 介面易用性與理解性: 如果介面過於複雜或難以理解,使用者將難以有效地使用和維護元件,這可能導致反效果。
  • 考慮使用彈性: 共用元件應該具有一定程度的彈性,以應對不同使用情境。適當的解耦設計能夠提高介面的使用彈性,從而適應多樣化的需求。
  • 未來擴展性考慮: 在設計共用元件時,應該考慮未來的擴展需求。合理的設計和架構能夠支持元件的擴展,避免後期功能衝突和維護困難。
  • 放置位置的考慮: 應該清楚共用元件應該放置在哪裡,是放在同一個系統中,還是放在跨系統的微服務中。同時需要考慮是否增加呼叫的成本以及系統整體的效能。

上一篇
Day 2 基本概念 - 軟體架構目標 (知識點001~007)
下一篇
Day 4 基本概念 - 架構SLA (知識點014~017)
系列文
軟體架構備忘錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言