官术网_书友最值得收藏!

1.1 可擴展性的定義

直觀地說,可擴展性是一個非常簡單的概念。維基百科對它的定義(https://oreil.ly/JsYXf)是“可擴展性是通過添加更多資源來處理越來越多的工作的系統屬性”。我們都知道如何擴展一個高速公路系統——增加更多的車道,這樣它就可以承載更多的車輛。我喜歡的一些人知道如何擴大啤酒生產規模——他們通過增加釀造容器的數量和擴大容器的體積、增加執行和管理釀造啤酒的人員數量,以及增加用來盛新鮮美味啤酒的桶的數量來實現產能擴大。任何物理系統——交通系統、機場,以及建筑物中的電梯——以及增加容量的途徑都是顯而易見的。

與物理系統不同,軟件系統在某種程度上是無定形的。它們并非是通過外部觀察就能了解其內部行為的東西,你無法指向它、看到它、觸摸它和感覺它。一個軟件系統就是一個數字工件(artifact)。從本質上講,構成可執行代碼和數據的1和0二進制流對于任何人來說都難以區分。那么,就軟件系統而言,可擴展性意味著什么?

避免陷入定義之戰,長話短說,可擴展性定義了軟件系統在某個運營維度上處理增長的業務量的能力。不同運營維度的例子有:

●系統可以同時處理的來自用戶或外部設備(例如傳感器)的請求的數量。

●系統可以有效處理和管理的數據量。

●對系統存儲的數據進行預測分析而獲得的價值。

●隨著請求量的增長,系統保持穩定、一致的響應時間的能力。

例如,假設一家大型連鎖超市正在迅速開設新店并增加每家商店的自助結賬終端的數量。這需要超市核心軟件系統能夠執行以下功能:

●在不縮短響應時間的情況下,處理增加的來自項目掃描的請求量。即時響應項目掃描對于維持客戶滿意度是必要的。

●處理和存儲因銷售額增加而產生的更多數據量。這些數據被用于庫存管理、會計、計劃和許多其他超市職能。

●從每個商店、不同地區和不同國家獲取“實時”(例如每小時)銷售數據摘要,并與歷史趨勢數據進行比較。這些趨勢數據讓某些地區的異常事件(意外的天氣條件、活動中的大量人群等)一目了然,并幫助受影響的商店迅速做出反應。

●隨著商店和客戶數量的增長,改進庫存訂購預測子系統,以便能夠正確預測銷售量(以及因此需要重新訂購庫存商品的需求量)。

上述不同維度的要求實際上是系統可擴展性的需求。如果在一年多的時間里,這家連鎖超市開了100家新店,銷售額增長了400倍(有些新店很大!),那么要保證超市能夠高效運營,便需要擴展軟件系統以提供足夠的處理能力。如果系統無法擴展并影響到客戶的購物體驗,那么當客戶不滿意時,我們會損失銷售額。我們可能會因為庫存滯留而增加成本。我們也可能會錯失根據當地情況舉辦促銷活動來增加銷售額的機會。上述所有現象都是降低客戶滿意度和利潤的因素,沒有一個對企業有利。

因此,成功擴展系統對于我們虛構的超市的業務增長至關重要,實際上,它也關系到許多現代互聯網應用程序的生存問題。但對于大多數商業和政府系統而言,在開發和部署的早期階段,可擴展性并不是主要的質量要求。相反,增強可用性和實用性的新功能成為我們開發周期的驅動力。只要在正常負載下系統性能滿足要求,我們就會不斷添加面向用戶的功能來提高系統的業務價值。事實上,在有明確的需求之前引入一些復雜的分布式技術(我將在本書中介紹的技術)可能對項目有害,額外的復雜性會導致開發過于保守。

盡管如此,在系統的發展過程中,提高系統性能和可擴展性成為當務之急甚至影響系統存亡的現象比比皆是。有吸引力的功能和實用性高的特性帶來了成功,但也帶來了更多需要處理的請求和更多需要管理的數據。這往往存在一個臨界點,在輕負載下有意義的設計和決策突然變成了技術債務[1]。以下來自系統外部的事件通常會引爆臨界點:2020年3月或4月的媒體上有許多關于政府失業和冠狀病毒大流行導致超市在線訂購網站無法承受激增的需求而崩潰的報道。

通過增加資源來增加系統在某個維度上的容量稱為縱向擴展(scaling up)或橫向擴展(scaling out)——稍后我將探討它們之間的區別。此外,與物理系統不同,能夠按比例縮小(scale down)系統容量以降低成本同樣重要。

一個非常典型的例子是Netflix,它需要處理來自不同區域的可預測的晝夜請求。概括地說,在任何地理區域,晚上9點觀看Netflix的人比早上5點要多。這使得Netflix可以在訪問量較低時減少資源,從而節省了在亞馬遜云中運行節點的成本,同時也帶來了社會價值,如降低數據中心能源功耗等。比較一下Netflix和高速公路:高速公路晚上很少有車,但我們不會撤回車道(修理除外)。為數不多的司機可以在全部道路上隨心所欲地行駛。在軟件系統中,我們可以在幾秒鐘內擴展和收縮系統的處理能力,以滿足瞬時訪問量。與物理系統相比,我們部署的策略大有不同。

關于軟件系統的可擴展性還有很多需要考慮的地方,讓我們先探討2021年左右的一些當代軟件系統的規模,然后再回到這些問題。

主站蜘蛛池模板: 襄樊市| 石台县| 玉树县| 阿克苏市| 长沙县| 灵丘县| 许昌市| 江油市| 白朗县| 湘西| 迭部县| 双江| 石首市| 桃园市| 紫阳县| 乡城县| 新田县| 金川县| 富阳市| 新乡市| 信丰县| 土默特左旗| 和林格尔县| 伊吾县| 德格县| 朝阳市| 陇川县| 南平市| 油尖旺区| 镇康县| 马关县| 阿鲁科尔沁旗| 白水县| 巴林右旗| 高陵县| 新巴尔虎左旗| 宁陕县| 肃北| 奉贤区| 石渠县| 普安县|