記得自己在沒有進入互聯網行業之前,對于互聯網行業并不怎么感冒,總覺得互聯網行業的技術含量不高,沒什么意思,值得進入互聯網行業了,才明白,原來互聯網行業的技術是這么的復雜,這么的困難,而構建一個擁有巨大用戶量的系統無疑也會給自己帶來更多的成就感,記得自己剛進入互聯網行業的時候,才發現構建一個高并發、高性能、承受高壓力、高度可伸縮以及高可用性的系統要掌握的知識體系是在太多了,而且這些知識體系根本就不是在學校或是google、網絡中能夠學習到的,于是當時就想,如果能有一本書全面的介紹構建這”五高“特性的系統需要掌握的知識體系,那將是多么的美好呀,畢竟很多的知識體系都是靠經驗積累出來的,甚至可是說,是痛苦的教訓等得出來的,但當然,要在一本書中完全講清楚所有的知識體系,自然是不靠譜的,但我想我會盡量在書中表達出自己的一些觀點、看法以及少少的經驗吧,希望能夠讓更多的同學即使沒有大型系統的實際經驗,也能掌握到一些大型系統所需的知識體系,那么我心甚慰了,由于本書需要寫的東西非常的多,預計在9月底完成寫作,估計要到明年春節后上市,:),以下先揭秘下本書的大概內容,也請大家多多提出意見,目錄的信息我在隨后的blog中再行貼出,同時在以后的blog中也會不定期的放出一些寫好的草稿以及做進度的預告。
本書圍繞著構建大型分布式Java應用系統的知識體系來進行編寫的,包括會出現哪些方面的難點和挑戰,對于這些難點和挑戰有什么辦法來解決,需要掌握些什么知識體系(例如第一章中的分布式Java應用的通訊技術、遠程調用技術也都是大型分布式Java應用所必須掌握的知識體系)。
1、 眾多子系統構成
當系統由眾多子系統構成時,想想100多個子系統構成的應用系統,如何管理好這些子系統就很重要了,例如子系統之間是如何調用的、每個子系統對外提供了哪些功能、子系統之間的依賴關系是怎么樣的、當發生調用時調用路徑是怎么樣的、這些子系統在運行期的狀況如何(例如有多少訪問量)等等。
要管理好這些子系統,首先第一個需要解決的問題是標準化子系統之間交互的方式,這一方面要求標準化每個子系統對外提供功能的方式,另一方面要求標準化每個子系統調用其他子系統提供的功能的方式,只有在這些標準化了以后才有可能管理好這些子系統,SOA無疑是非常匹配的一種架構級的選擇,除了軟件角度外,如何運維、管理好這么眾多的子系統也是難點。
對于眾多子系統構成的應用而言,如何管理并不是全部,還有其他很多相伴而來的問題也是需要解決的,例如跨子系統的調用時,如何保證整個調用過程的事務、雪崩效應等。
標準化是管理好眾多子系統的根本,并且它要求的是架構級的全局支持,因此在本書中首先講解這個形容詞定語的解決方案以及所需的知識體系,也就是本章節的重點。
2、 承受高壓力
大型企業應用或互聯網應用,都有眾多的使用者,眾多的使用者也就意味著系統需要并發的被眾多的用戶訪問,而這通常很容易暴露出系統中很多并發場景中罕見的現象,因此在編寫此類應用時需要非常仔細的考慮系統對于高并發的支持,同時,由于每臺機器上的應用能夠支撐的用戶量必然是有限(例如某網站的服務器,單臺支撐500W的PV已經是業界佳話了),如何支撐巨大的用戶訪問量就成為了關鍵,而這里面如何在盡量不改變現有程序的基礎上來支撐不斷增長的用戶訪問量就是更為重要的關鍵了。
要承受高壓力首先要求系統具備高性能,只有系統是高性能的,才有可能支撐足夠的壓力,其次是系統需要具備高度可伸縮的能力(包括垂直伸縮和水平伸縮),要讓系統具備這兩點,對于系統的軟件結構以及硬件體系都有很高的要求,在本書的第七章和第八章中將來重點講解從軟件結構角度如何保障系統具備高度可伸縮的能力。
除了上述的點之外,要讓系統能夠更好的承受高壓力,其實還需要由合理的評估,以事先對系統的結構進行改造或進行硬件上的擴充等,這屬于非常專業的容量規劃的領域,就不在這本書中進行講述了,如感興趣的話可以參閱相關的容量規劃的書籍。
3、 具備高性能
無論是大型企業應用還是互聯網應用,都要求在短時間內響應用戶的請求,如電話計費系統、淘寶網,怎么樣才能讓系統具備高性能呢,這在大型分布式系統中就更為的復雜了,因為在大型分布式系統中通常一個請求需要經過好幾個子系統才能完成。
要編寫高性能的應用,這就要求應用設計人員能夠充分掌握實現需求的可選的技術方案,并對技術方案中的所有細節都非常的精通,例如jdk的實現、操作系統的實現以及底層的原理,除了軟件方面的深刻理解外,對于硬件也是要求有深刻的理解的,但本書只涵蓋軟件方面的內容,因此對于硬件相關的原理就不進行描述了,只有在充分掌握這些原理的情況下才能根據系統的需求以及性能要求選擇最為合適的技術,除了編寫高性能的程序外,另外需要具備衡量系統性能的指標以及方法,只有這樣才能知道系統的性能到底如何,瓶頸在什么地方,最后還需要具備系統調優的能力,而這通常需要從硬件角度、軟件環境角度(例如操作系統、jvm等)以及程序角度來進行調優,以使系統能夠到達所要求的性能,在本書的第三、四、五以及六章中將來重點講述編寫高性能的Java應用所需掌握的知識體系。。
4、 具備高可用性
大型企業應用和互聯網應用,都要求系統7 * 24小時不間斷的穩定運行,如何才能保證系統在各種各樣的訪問情況下都不宕機,這對于系統的實現人員來說是個巨大的挑戰。
要讓系統在各種情況下不宕機,首先要求的是軟件本身具備很好的穩定性,要編寫穩定性高的程序要求對所采用的技術具備非常深刻的理解,這點和編寫高性能程序是一樣的,從這點也是互聯網公司都強調核心的技術都需要自己編寫的原因之一。
除了軟件本身需要具備很好的穩定性外,也還需要采用其他很多的防范來保障系統的可用性,例如常用的方法為集群(即多臺提供同樣功能的服務器,這樣即使其中的幾臺出問題也仍然可以服務)、容災,還有更為復雜的方法像異地容災、異地分流以及多數據中心的建設等等,這些方法并不是直接按照理論就可以實現的,對于軟件本身的結構也提出了很高的要求,在本書的第九章中將來詳細講述如何構建高可用性的java應用。