系统为什么要分层?
在日常的軟件開發當中,我們一般都是采用了分層的方式來架構系統,但是為什么我們需要分層進行架構呢?在此之前,我覺得需要 搞明白兩個概念,什么是軟件的伸縮性,什么是性能。 首先,什么是軟件的伸縮性(Scalability)?我們都知道設計良好的系統可以應對不斷增加的系統訪問量,但是我們如何能在系統用戶增多的時候,來提高系統的吞吐量呢?這就是伸縮性之魅力所在。 伸縮性可以有兩個方面,垂直伸縮性和水平伸縮性,垂直伸縮性是通過在同一個業務單元中增加資源來提高系統的吞吐量,比如增加服務器cpu的數量,增加服務器的內存等。水平伸縮性是通過增加多個業務單元資源,使得所有的業務單元邏輯上就像是一個單元一樣。比如ejb分布式組件模型,集群配置等都屬于此種方式。 下面我說一下,我對性能的理解,我們在日常的開發當中,當說到性能的時候,一般都會首先想到系統有多“快”,我想說的就是性能還涉及到另一個方面,那就是系統有“多少”,也就是說系統的吞吐量。我們在考慮性能的時候,一般都會考慮到這兩方面。 理解了伸縮性和性能這兩個概念以后,我們來看看系統為什么需要分層架構。 首先采用分層架構的好處,我想大家肯定都會普遍接受的是,系統分層有利于系統的維護,系統的擴展。這其實就是系統的可維護性和可擴展性。 其次,我圍繞伸縮性以及性能來說一下,為什么需要分層架構。比如在目前的J2EE系統開發當中,我們普遍采用了分層構架的方式,一般分為表現層,業務層和持久層,當然了我們還可以對各層進行進一步的劃分,但是層次劃分也不能太細,具體項目要具體對待,原因下面討論。我們想想,采用分層以后會帶來什么不好的地方?想這個問題,我們可以先反過來想一下,不采用分層有什么好處,這當然是每個業務處理速度會更快,因為層與層之間通信會引來額外的開銷,所以采用分層后,給我們軟件系統帶來的就是每個業務處理開銷會變大。 好了,既然采用分層會帶來額外的開銷,那么我們為什么還要進行分層呢?這就涉及到了伸縮性和性能的問題。如果不采用分層的話系統的擴展和伸縮也主要靠垂直伸縮,但是垂直伸縮是有限度的,隨著系統規模的擴大,垂直伸縮帶來的代價也將變得非常昂貴。當采用了分層以后,雖然帶來了層與層之間的通信開銷(這得益于計算機硬件的飛快發展,如果計算機硬件的發展水平不足以抵消分層以后帶來的額外的開銷,那么分層架構也會有一個巨大的問號,所以從某種程度上來說,分層架構也利用了一點垂直伸縮性),但是它有利于層的水平伸縮性,并且各個層都可以進行獨立的伸縮而不會影響到其它的層,比如EJB分布式組件模型以及目前采用的分成架構的方式就有利于水平伸縮性. ?對于性能方面,我上面也說了,性能存在兩個方面,一是“快”,二是“多少”,采用分層架構,當然會影響到性能快的方面,因為層次之間通信會帶來額外的開銷,但是采用了分層架構后,我們的軟件系統可以更容易變大(“多少”的問題),也就是說當系統要應對更大的訪問量的時候,我們可以通過增加多個業務單元資源(此時的多個業務單元邏輯上看起來就像一個邏輯單元,這對外界是透明的)來增加系統吞吐量。所以對于那些實時性比較高的系統,層的劃分不應該太細,太細必然帶來實時性的減低,而對于實時性不高,而需要高度的伸縮性的系統,我們可以通過引入不同的層來達到系統水平伸縮的目的。 以上是有關伸縮性和性能,以及它們與分層架構之間的聯系,下面我再說一下另外一個問題,這就是Amdahl?law(阿姆達爾定律),這個定理主要說明了系統中串行部分對系統速度提升的影響,假設程序中串行部分占a%的比例,那么程序最多提升1/a%的速度。我從這個定律也看出了,軟件垂直伸縮的局限性,因為無論增加多少個cpu,如果程序中有串行化的部分,那么程序的速度的提升是有一個極限的,是不能靠增加硬件來無限度的增強系統性能的。所以對于我們軟件工程師來說,我們更加需要關注系統的水平伸縮性。 <!--EndFragment-->
轉載于:https://blog.51cto.com/yuquan/360750
總結
- 上一篇: CSS 背景透明
- 下一篇: java获取操作系统信息