軟件系統的可擴展性設計

一、可擴展性的設計關注點

通常網站的可擴展性架構設計,能夠在對現有系統影響最小的情況下,同時能保持可持續擴展和穩定提升的能力。
按照可擴展性的定義,一個具備良好可擴展性的架構設計應當符合開閉原則:對擴展開發,對修改關閉。
衡量一個軟件系統具備良好可擴展性主要表現但不限於:

  • 軟件內部方面:在軟件系統實現新增業務時,對現有系統功能影響較少,即不需要對先用功能做任何改動或很少改動。
  • 軟件外部方面:軟件系統本身與其他存在協同關係的外部系統之間存在鬆耦合關係,軟件系統的變化對其他軟件系統無影響,其他軟件系統和功能不需要進行改動。反之,則是一個擴展性不好的軟件系統。

開閉原則明確的告訴我們:軟件實現應該對擴展開放,對修改關閉,其含義是說一個軟件實體應該通過擴展來實現變化,而不是通過修改已有的代碼來實現變化的。

1.可擴展性設計的優勢

其表現爲基礎設置不需要經常變更,應用之間較少依賴或耦合,可以對需求變更快速響應。

它對擴展開放,對修改關閉。架構設計會考慮到未來功能的可擴展性,所以當系統增加新功能時,不需要對現有系統的結構和代碼進行修改。
度量一個開發框架、設計模式或者編程語言優劣的一個重要尺度就是他是否能夠讓軟件開發過程和軟件產品更加低耦合。
因爲低耦合的系統更容易擴展,也更容易被複用,而且也會讓開發過程和維護變得更加容易。但如何分解系統的各個模塊、如何定義各個模塊的接口,如何複用、組合不同模塊構造一個完整的系統,這是軟件設計中最具挑戰性的部分。
架構設計的最大價值,就在於把一個大系統分解爲多個低耦合的子模塊的能力,這些子模塊包含橫向的業務模塊和縱向的基礎技術模塊。這種能力來源於專業能力與經驗、業務場景的理解、對人性的把握以及對世界認知。
構建可擴展的網站架構的核心思想是模塊化,並在此基礎上,降低模塊之間的耦合,提高模塊的複用性。
可以利用分層與分割的方式,把軟件分割爲若干個低耦合、獨立的組件模塊,然後這些組件模塊之間以消息傳遞或依賴調用的方式聚合在一起合成一個完整的系統。這些模塊可以通過分佈式部署的方式,部署在獨立的服務器上。這種從物理上分離模塊之間的耦合關係,可以進一步降低耦合性。

2.可擴展性設計的目的

可擴展性設計的目的在於爲了處理更大規模的業務。
在項目初期,硬件的成本會非常高,但隨着時間的推移,軟件成本變得昂貴得多。因此,構建應用程序時,應該想法讓他不需要或者很少需要軟件就能擴展;買更多的硬件,使用更多硬件來擴展要好一些。爲了處理更大規模的業務,同時保證性能提升,還要搞清楚如何向外擴展。垂直擴展和水平擴展是其中兩個重要的方法。

3.可擴展性設計的兩種方法

  • “垂直擴展”:
    在同一個邏輯單位添加資源以增加容量。開始的設置非常基礎,可能就是一臺web服務器和一臺數據庫服務器。當機器性能不足時,用更大的機器替換它。新機器能力不足時,用另外一臺機器替換它。這臺機器能力也不足時,就買一臺更加強大的機器。如此反覆。
  • “水平擴展”
    水平擴展內在原則上和垂直擴展相似,不斷添加更多的硬件。不同於垂直擴展的地方在於,增長時不需要超級強勁的機器,而只需要很多常規的機器。從一臺常規的機器開始,其能力不足後添加第二臺。然後第三臺,第四臺等。增加多個邏輯單元資源並且使他們作爲一個整體在工作。大多數的集羣解決方案,比如分佈式文件系統,負載均衡都是通過橫向擴展技術來進行的。

二、擴展方式

設計具備良好可擴展性的系統,有兩個思考角度:從業務維度,對業務深入理解,對可預計的業務變化進行預測;從技術維度,利用擴展性好的技術,實現對變化的封裝。

  • 在業務維度

對業務深入理解,對業務的發展方向進行預判,也就是不能完全不考慮可擴展性;但是變化無處不在,對業務看得遠一點的同時,需要注意的是,要警惕過度設計;不能每個設計點都考慮可擴展性;所有的預測都存在不正確的可能。

  • 在技術維度

預測變化是一回事,採取什麼方案來應對變化,優勢另外一個複雜的事情。及時預測很準確,如果方案不合適,則系統擴展性很麻煩。第一種應對變化的常見方案是將“變化”封裝在一個“變化層”,將不變的部分封裝在一個獨立的“穩定層”。第二種常見的應對變化的方案是提煉出一個“抽象層”和一個“實現層”。

1.分層架構

三層架構通常意義上的三層架構就是將整個業務應用劃分爲:界面層、業務邏輯層、數據訪問層。區分層次的目的即爲了“高內聚低耦合”的思想。在軟件體系架構設計中,分層式結構是最常見,也是最重要的一種結構。
在早期的單體應用中,通過系統分層,每層可以獨立的變化,降低的系統內部的耦合程度。分層的思想也是模塊化的體現。

2.消息隊列

如果模塊之間不存在直接調用關係,那麼新增或修改對其他部分的影響最小,這樣的擴展性自然更好。通過在低耦合的模塊之間傳輸事件消息,保持模塊之間的鬆散耦合。不同系統之間,通過消息傳遞的方式,實現了系統之間的解耦。採用消息的方式,通常還是異步操作的,能夠提升系統的性能。

3.遠程調用

隨着網站功能日益複雜,系統會逐漸發展成爲一個巨無霸,裏面聚合了大量的應用和服務組件,這樣的一個系統會給開發,維護,部署帶來巨大的麻煩。所以我們要做拆分,把模塊獨立部署,降低系統的耦合性。
複用的業務分出來,獨立開發部署爲分佈式服務,新增的業務只需要遠程調用這些分佈式的服務,就可以快速搭建出一個應用系統,技術模塊內的業務邏輯發生變化,只要保持接口一致,就不會影響其他模塊。
目前,採用Dubbo,以及SpringCloud可以輕鬆的完成系統的構建任務。

4.開放平臺

放平臺是網站內部和外部交互的接口。外部會面對衆多的第三方開發者。內部面對的是網站內衆多的業務服務。下面是開放平臺的常用架構:

  • API接口:暴露給開發者的一組API,可以使Restful,RPC等。
    協議轉換:把各種API的輸入轉換爲內部服務可識別的形式,並把內部服務的返回封裝爲API格式。
  • 安全:除了身份識別,權限控制等手段之外,還要對訪問帶寬進行分級限制,保證平臺資源被第三方應用合理公平的使用,也能保證網站自身的內部服務不被外部應用拖垮。
  • 審計:監控第三方應用的訪問情況並計費。
  • 路由:把開放平臺的各種訪問路由映射到具體的內部服務。
  • 流程:把一組鬆散的服務組織成一個上下文相關的新服務,對外提供接口供開發者使用。

三、企業級系統的平臺化設計

一個高度平臺化的系統,對高擴展性和靈活性是非常關注的,作爲企業管理信息系統,最大的挑戰是如何滿足不同企業通用需求的同事快速滿足企業個性化需求,除了企業戰略、組織架構、流程體系等緊密相關外,軟件的平臺化水平,可擴展性和靈活性至關重要。一個高度平臺化的系統對高擴展性是非常關注的。

1.分層設計

高可擴展性和靈活性的系統一版是分層架構,這裏說的分層是指將客戶的需求按照需求的通用性分層。根據自己平臺所應用的目標客戶羣,分析客戶的共性需求,將共性部分的需求按需求的通用性分層。根據自己平臺所應用的目標客戶羣,分析客戶的共性需求,將共性部分的需求放在平臺的最底層實現,所有的客戶共用,不要有分支版本,個性的需求放在高層實現。
不同的客戶可以完全定製。至於整個架構的層次數量沒有絕對的標準,可參考的方法分爲4層,

  • 公共平臺層
  • 產品平臺層
  • 行業擴展層
  • 個性擴展層

這裏的分層與軟件架構中的表示層,中間層,持久層的分發屬於不同的維度,是沒有衝突的。

2.模塊化

高可擴展性的系統一般都是模塊化的。
系統最好提供統一的基礎組件,通過二次開發的手段提供上層擴展,做項目多了一版都會形成組件庫,應該對這些組件進行分類分級管理。一旦有了新的項目,一般從現有的組件庫中挑選進行配置,部分不滿足要求的可以進行修改後滿足,其他個性化很強的完全定製。

3.數據建模

提供圖形化的數據建模模塊,可以自動生成數據庫的表結構,同事將數據的結構也保存爲元數據,不依硬編碼。

4.流程建模

採用圖形化的方式,定義企業的業務流程,依賴業務流程的驅動完成流程的自動化。流程一般需要人的參與,所以與任務管理緊密相關,可能會涉及集成Email,手機短信實現自動通知。

5.狀態建模

一般數據對象有多個狀態,比如訂單就有未發貨,已發貨,已到貨等狀態,不同狀態下可執行的操作也是不同的,不同的狀態下權限也會有差異。一般按照數據類型定義狀態圖,不同的狀態有不同的操作和權限,一般依賴於各個操作或流程改變對象的狀態。

6.權限建模

不同的數據類型通常由一些功能的權限項,比如瀏覽、修改等。應該支持自定義的權限項,不同的類型授權時權限項不同。權限的授予一般也有粒度要求,最小的按單個個體授權,最大的按類型授權。

7.報表系統

不同的角色可以看到不同的報表,最好建立報表的框架,開發一個新的報表後,通過簡單的配置,不依賴修改代碼,就可以通過系統訪問到報表。報表的各種操作,也可以通過配置實現。

8.界面建模

企業中不同角色都希望看到與自己工作相關的功能,這就需要可以按角色自定義菜單和主頁,主頁的自定義用戶可以選擇自己需要的部分,添加到主頁上。

四、總結

總體來說,可擴展作爲軟件非功能性設計的一個關注指標,其外在表現是多方面的,包括了分層結構、模塊化、數據建模,流程建模等。甚至還包括權限體系的擴展等方面,當然真的要構建高擴展性的系統難度是很大的,也是系統複雜性的重要來源,通常都會遇到諸如性能問題,在各種複雜要求下尋求最好的平衡,大部分問題是可以解決的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章