什麼是軟件可擴展性,為什麼您的公司應該認真對待它?

已發表: 2023-08-01

即使是經驗豐富且成功的公司也會在可擴展性方面遇到麻煩。 您還記得迪士尼的掌聲應用程序嗎? 它使用戶能夠與不同的迪士尼節目互動。 當該應用程序出現在 Google Play 上時,非常受歡迎。 但可擴展性不太好。 它無法應對大量粉絲,導致用戶體驗不佳。 人們非常憤怒,在 Google Play 上留下了負面反饋和一星評級。 該應用程序從未從這種負面宣傳中恢復過來。

如果您在開發的早期階段關注軟件的可擴展性,無論您自己實現還是使用軟件工程服務,都可以避免此類問題。

那麼,什麼是軟件的可擴展性呢? 如何確保您的解決方案具有可擴展性? 什麼時候需要開始擴展?

什麼是軟件可擴展性?

Gartner 將可擴展性定義為衡量系統響應處理需求變化而降低或提高性能和成本的能力。

在軟件開發的背景下,可擴展性是應用程序處理工作負載變化的能力,同時以最低的成本添加或刪除用戶。 因此,可擴展的解決方案預計在工作負載急劇增加(無論是預期的還是自發的)後保持穩定並保持其性能。 工作量增加的例子有:

  • 許多用戶同時訪問系統
  • 存儲容量需求的擴大
  • 正在處理的交易數量增加

軟件可擴展性類型

您可以水平或垂直縮放應用程序。 讓我們看看每種方法的優點和缺點是什麼。

軟件水平可擴展性(橫向擴展)

您可以通過將額外的節點合併到系統中來水平擴展軟件以處理更高的負載,因為它將分佈在計算機上。 例如,如果應用程序開始遇到延遲,您可以通過添加另一台服務器進行擴展。

當您無法估計應用程序將來需要處理多少負載時,水平可擴展性是更好的選擇。 對於需要快速擴展且無需停機的軟件來說,它也是首選。

好處:

  • 對失敗的韌性。 如果一個節點發生故障,其他節點將接替它
  • 擴展期間沒有停機時間,因為在添加新節點時無需停用現有節點
  • 理論上,水平擴展的可能性是無限的

限制:

  • 增加了複雜性。 您需要確定工作負載如何在節點之間分配。 您可以使用 Kubernetes 進行負載管理
  • 成本較高。 添加新節點的成本高於升級現有節點的成本
  • 整體軟件速度可能會受到節點通信速度的限制

垂直軟件可擴展性(擴展)

垂直可擴展性是指為現有硬件添加更多功能。 如果通過水平可擴展性,您需要添加另一台服務器來處理應用程序的負載,那麼您將通過添加更多處理能力、內存等來更新現有服務器。另一種選擇是刪除舊服務器並連接更先進、功能更強大的服務器。

當您知道需要合併的額外負載量時,這種可擴展性類型效果很好。

好處:

  • 無需更改配置或應用程序的邏輯即可適應更新的基礎架構
  • 降低費用,因為升級成本低於添加另一台機器的成本

限制:

  • 升級過程中有停機時間
  • 升級後的機器仍然存在單點故障
  • 一台設備的升級數量有限制

軟件的垂直與水平可擴展性

下面是一個表格比較,概述了兩種軟件可擴展性類型的不同方面。

什麼時候你絕對需要可擴展性?

許多公司放棄了軟件工程的可擴展性,轉而支持降低成本和縮短軟件開發生命週期。 儘管在某些情況下可擴展性並不是一個重要的系統質量屬性,但在大多數情況下,您需要從產品生命週期的早期階段就考慮它。

當不需要軟件可擴展性時:

  • 如果該軟件是概念驗證 (PoC) 或原型
  • 為小公司開發僅供員工使用的內部軟件時
  • 沒有後端的移動/桌面應用程序

對於其餘的,強烈建議研究可擴展性選項,以便在時機成熟時做好準備。 您怎麼知道是時候進行擴展了? 當您注意到性能下降時。 以下是一些跡象:

  • 應用程序響應時間增加
  • 無法處理並髮用戶請求
  • 錯誤率增加,例如連接失敗和超時
  • 瓶頸經常形成。 無法訪問數據庫、身份驗證失敗等。

構建高度可擴展的軟件的技巧

如果在軟件開發之初就考慮到的話,軟件可擴展性會更便宜且更容易實現。 如果您在實施過程中未採取必要的步驟而必須意外擴展,則該過程將消耗更多的時間和資源。 其中一種方法是重構代碼,這是一項重複的工作,因為它沒有添加任何新功能。 它只是做了開發過程中應該做的事情。

下面您可以找到八個技巧,它們將幫助您構建未來更容易擴展的軟件。 下表將技巧分為不同的軟件開發階段。

提示#1:選擇在雲中託管以獲得更好的軟件可擴展性

您有兩種選擇來託管應用程序:在雲中或在本地。 或者您可以使用混合方法。

如果您選擇本地模型,您將依賴自己的基礎設施來運行應用程序、容納數據存儲等。這種設置將限制您的擴展能力並使其更加昂貴。 但是,如果您在受到嚴格監管的行業運營,您可能別無選擇,因為本地託管可以讓您更好地控制數據。

此外,在某些行業(例如銀行業),交易處理時間至關重要,您不能等待雲響應或容忍雲提供商的任何停機。 在這些行業中運營的公司僅限於使用特定的硬件,並且不能依賴雲提供商提供的任何服務。 對於時間敏感、關鍵任務的應用程序(例如自動駕駛汽車)也是如此。

選擇雲計算服務將使您能夠訪問第三方資源,而不是使用您的基礎設施。 借助雲,您幾乎可以無限地擴展和縮小規模,而無需投資服務器和其他硬件。 雲供應商還負責維護和保護基礎設施。

如果您在醫療保健行業工作,可以查看我們關於醫療行業雲計算的文章。

技巧#2:使用負載平衡

如果您決定水平擴展,則需要部署負載平衡軟件,以在所有能夠處理請求的設備之間分配傳入請求,並確保沒有服務器被淹沒。 如果一台服務器出現故障,負載均衡器會將服務器的流量重定向到可以處理這些請求的其他在線計算機。

當連接新節點時,它將自動成為設置的一部分,並且也將開始接收請求。

技巧#3:盡可能多地緩存

緩存用於存儲靜態內容和預先計算的結果,用戶可以訪問而無需再次進行計算。

緩存盡可能多的數據以減輕數據庫的負載。 配置處理邏輯,以便可以從分佈式緩存中檢索很少更改但經常讀取的數據。 這比使用每個簡單請求查詢數據庫更快、更便宜。 此外,當某些內容不在緩存中但經常訪問時,您的應用程序將檢索它並緩存結果。

這就帶來了一些問題,比如應該多久讓緩存失效,一條數據需要訪問多少次才能複製到緩存等等。

提示 #4:通過 API 啟用訪問

最終用戶將通過各種客戶端訪問您的軟件,並且提供每個人都可以用來連接的應用程序編程接口(API)將會更加方便。 API 就像一個中介,允許兩個應用程序進行對話。 確保考慮到不同的客戶端類型,包括智能手機、桌面應用程序等。

請記住,API 可能會讓您面臨安全漏洞。 嘗試在為時已晚之前解決這個問題。 您可以使用安全網關、強身份驗證、加密方法等。

技巧 #5:從異步處理中受益

異步進程是可以在後台執行任務的進程。 客戶無需等待結果,可以開始處理其他事情。 該技術支持軟件可擴展性,因為它允許應用程序運行更多線程,從而使節點更具可擴展性並處理更多負載。 而且如果有耗時的任務進來,也不會阻止執行威脅,應用程序仍然能夠同時處理其他任務。

異步處理還涉及將進程分散為多個步驟,如果這對系統來說並不重要,則無需等待一個步驟完成即可開始下一個步驟。 這一設置允許將一個進程分佈在多個執行線程上,這也有利於可擴展性。

異步處理是在代碼和基礎設施級別實現的,而異步請求處理是代碼級別的。

提示#6:如果可能,選擇更容易擴展的數據庫類型

有些數據庫比其他數據庫更容易擴展。 例如,NoSQL 數據庫(例如 MongoDB)比 SQL 更具可擴展性。 前面提到的 MongoDB 是開源的,通常用於實時大數據分析。 其他 NoSQL 選項包括 Amazon DynamoDB 和 Google Bigtable。

SQL 在擴展讀取操作時表現良好,但由於其符合 ACID 原則(原子性、一致性、隔離性和持久性),它在寫入操作上表現不佳。 因此,如果這些原則不是主要關注點,您可以選擇 NoSQL 以更輕鬆地擴展。 如果您需要依賴關係數據庫來實現一致性或任何其他問題,仍然可以使用分片和其他技術進行擴展。

提示#7:如果適用,選擇微服務而不是整體架構

整體架構

單體軟件被構建為一個結合了客戶端和服務器端操作、數據庫等的單個單元。一切都緊密耦合,並且其所有功能都有一個單一的代碼庫。 您不能只更新一部分而不影響應用程序的其餘部分。

可以擴展整體軟件,但必須使用垂直擴展方法進行整體擴展,這是昂貴且低效的。 如果您想升級特定部分,就無法避免重建和重新部署整個應用程序。 因此,如果您的解決方案並不復雜並且僅由有限數量的人使用,請選擇整體式解決方案。

微服務架構

微服務比單體應用更靈活。 以這種風格設計的應用程序由許多協同工作但獨立部署的組件組成。 每個組件都提供特定的功能。 構成一個應用程序的服務可以具有不同的技術堆棧並訪問不同的數據庫。 例如,構建為微服務的電子商務應用程序將具有一項用於產品搜索的服務,另一項用於用戶配置文件的服務,還有一項用於訂單處理的服務,等等。

微服務應用程序組件可以獨立擴展,而不會對整個軟件造成負擔。 因此,如果您正在尋找可擴展的解決方案,微服務是您的首選設計。 高軟件可擴展性只是您可以從此架構中獲得的眾多優勢之一。 有關更多信息,請查看我們關於微服務優勢的文章。

提示 #8:監控性能以確定何時進行擴展

部署後,您可以監控軟件以捕獲性能下降的早期跡象,這些跡象可以通過擴展來解決。 這使您有機會在問題升級之前做出反應。 例如,當您注意到內存不足或消息等待處理的時間超過指定限制時,這表明您的軟件正在以其容量運行。

為了能夠識別這些以及其他與軟件可擴展性相關的問題,您需要在編碼階段將遙測監控系統嵌入到您的應用程序中。 該系統將使您能夠跟踪:

  • 平均響應時間
  • 吞吐量,即給定時間處理的請求數
  • 並髮用戶數
  • 數據庫性能指標,例如查詢響應時間
  • 資源利用率,例如CPU、內存使用、GPU
  • 錯誤率
  • 每用戶成本

您可以受益於現有的監控解決方案和日誌聚合框架,例如 Splunk。 如果您的軟件在雲端運行,您可以使用雲供應商的解決方案。 例如,Amazon 為此提供了 AWS CloudWatch。

ITRex 產品組合中的可擴展軟件解決方案示例

配備私人教練的智能健身鏡

項目介紹

客戶想要製作一面全長壁式健身鏡,以幫助用戶進行日常鍛煉。 它可以在鍛煉期間監控用戶的狀態、計算重複次數等等。 該系統應該包含允許培訓師創建和上傳視頻以及用戶記錄和管理他們的鍛煉的軟件。

我們為確保軟件的可擴展性所做的工作

  • 我們選擇微服務架構
  • 實現了負載分配的水平可擴展性。 每當現有節點負載過多時,就會添加新節點。 因此,每當 CPU 使用率超過其容量的 90% 並持續一段指定的時間時,就會添加一個新節點來緩解負載。
  • 出於架構原因,我們必須部署關係數據庫(即 SQL 和 PostgreSQL)。 儘管關係數據庫更難擴展,但仍然有多種選擇。 一開始,由於用戶基數還比較小,我們選擇了縱向擴展。 如果受眾越來越多,我們計劃部署主從方法——將數據分佈在多個數據庫中。
  • 由於該系統包含大量靜態信息,例如教練姓名、鍛煉標題等,因此從緩存中受益匪淺。
  • 使用 RestAPI 在鍛煉應用程序和服務器之間進行異步請求處理
  • 依賴無服務器架構(例如 AWS Lambda)進行其他類型的異步處理。 異步視頻處理就是一個例子。 培訓師加載新的鍛煉視頻並將其分割成不同的練習後,他們按下“保存”,服務器開始處理該視頻以進行 HTTP 實時流傳輸,以構建具有不同分辨率的原始視頻的四個版本。 培訓師可以同時上傳新視頻。
  • 在另一個示例中,系統對用戶視頻進行異步智能修剪,以刪除用戶不活動的任何部分。

基於生物識別技術的網絡安全系統

項目介紹

客戶希望建立一個網絡安全平台,使企業能夠根據生物識別技術對員工、承包商和其他用戶進行身份驗證,並避開密碼和 PIN。 該平台還將包含一個實時視頻工具,用於遠程確認用戶身份。

我們如何確保該軟件具有可擴展性

  • 我們使用了去中心化的微服務架構
  • 部署三個負載均衡器以在不同的微服務之間分配負載
  • 該平台的某些部分在設計上是可自動擴展的。 如果負載超過某個閾值,則會自動創建微服務的新實例
  • 我們使用了六個不同的數據庫——四個 PostgreSQL 和兩個 MongoDB。 PostgreSQL 數據庫在需要時可以垂直擴展。 在設計架構時,我們意識到某些數據庫必須經常擴展,因此我們為此採用了 MongoDB,因為它們更容易水平擴展。
  • 部署異步處理以獲得更好的用戶體驗。 例如,視頻後處理是異步完成的。
  • 我們選擇了第三方服務提供商的面部識別算法。 因此,我們確保選擇一個已經可擴展的解決方案,並通過 API 將其整合到我們的平台中。

擴展時可能遇到的挑戰

如果您打算在應用程序開發過程中規劃軟件可擴展性並希望採用上述技巧,您仍然可能面臨以下挑戰:

  • 積累的技術債務。 項目利益相關者可能仍然試圖放棄可擴展性,以支持更低的成本、速度等。可擴展性不是功能性需求,可能會被更具體的特徵所掩蓋。 結果,應用程序將積累與可擴展性不兼容的技術功能。
  • 使用敏捷開發方法進行擴展。 敏捷方法論就是擁抱變化。 然而,當客戶想要頻繁地實施太多更改時,可以為了適應不斷變化的需求而擱置軟件可擴展性。
  • 可擴展性測試。 執行實際的負載測試很困難。 假設您想要測試如果將數據庫大小增加 10 倍,系統將如何運行。 您將需要生成大量與原始數據特徵相匹配的真實數據,然後為寫入和讀取生成真實的工作負載。
  • 第三方服務的可擴展性。 確保您的第三方服務提供商不會限制可擴展性。 選擇技術供應商時,請驗證他們是否能夠支持預期的軟件可擴展性水平,並正確集成其解決方案。
  • 了解您的應用程序的用途。 您需要清楚地了解您的軟件將如何工作以及有多少人將使用它,而這幾乎不可能精確估計。
  • 架構限制。 有時您的架構選擇受到限制。 例如,您可能需要使用關係數據庫,並且必須處理水平和垂直擴展。
  • 擁有合適的人才。 為了設計一個將來不會讓您頭疼的可擴展解決方案,您需要一位經驗豐富的架構師,之前曾從事過類似項目,並且從編碼和基礎設施的角度了解軟件可擴展性。 在 ITRex Group,我們參與過許多項目,並且在軟件開發過程中始終牢記可擴展性。

總結

除非您絕對確定不需要擴展,否則請在開發的早期階段考慮軟件的可擴展性並採取必要的預防措施。 即使您的架構選擇受到限制並且無法始終實現最具可擴展性的選項,您仍然會知道障礙在哪裡,並且有時間考慮替代方案。

為了其他功能需求而放棄可擴展性將會適得其反。 首先,公司將面臨業績下降的困境。 處理請求將花費太長時間。 用戶將經歷不可接受的延遲。 完成這一切之後,該公司將支付兩倍或三倍於早期階段可能支出的金額。

考慮部署新的企業軟件或更新現有系統,但擔心它無法跟上快速增長的業務需求? 保持聯繫! 我們將確保您的軟件不僅具有所需的所有功能,而且可以以最少的投資和停機時間進行擴展。


最初於 2023 年 7 月 24 日發佈於https://itrexgroup.com