大型網站架構從來都不是一個預先定義的架構,而是一個演進式的架構。很少有一個網站從建站開始,就能夠因具備大型網站的所有屬性而一成不變的,從最簡單的LAMP架構,再到基於IOE的大型集中式應用架構,再演變成時下的分散式應用架構,隨著網站用戶規模的擴大,架構也在不斷演進。從實體機到虛擬機再到當前流行的Do... ...
大型網站架構從來都不是一個預先定義的架構,而是一個演進式的架構。很少有一個網站從建站開始,就能夠因具備大型網站的所有屬性而一成不變的,從最簡單的LAMP架構,再到基於IOE的大型集中式應用架構,再演變成時下的分散式應用架構,隨著網站用戶規模的擴大,架構也在不斷演進。從實體機到虛擬機再到當前流行的Docker技術,從單機房到同城多機房再到異地多活,從LAMP到J2EE再到各種分散式中間件如服務框架、分散式消息隊列、配置管理中間件、分散式數據訪問層,由簡至繁的艱難蛻變,也正是一個網站從小變大由弱變強的成長歷程,哪裡有挑戰,哪裡才會有變革,這正是作為技術人建功立業的時刻。
規模不斷擴大,但成本不可能隨之線性增長,因此,如何利用規模效應降低資源成本,抽取公共部分,避免重覆造輪子,提高開發效率和響應速度,成了必須思考的問題。技術存在的核心價值就是為了生產力的提高,當技術架構制約了生產力發展,就需要進行技術變革。當前支撐大型網站的幾大核心技術,分散式、服務化、虛擬化,其中分散式解決的是規模化帶來的問題,所謂的規模化即包括數據規模越來越大,訪問量越來越高,也包括開發團隊規模越來越大,工程代碼規模越來越大。
單機的存儲能力以及負載能力必然有限,從PC到小型機再到中型機、大型機,成本將成指數級升高,而成百上千人開發同一個工程,則導致系統臃腫,開發、發佈效率極低,互聯網將喪失了賴以生存的靈活性,回到以前傳統軟體的開發模式。通過應用垂直拆分,集群分散式水平擴展,不僅使系統容量得到提升,存儲和負載將分配到大規模的廉價集群上,以降低成本,開發效率和開發模式也得到改變。
通過公共業務抽取,將誕生一批處於系統底層的基礎服務,避免相同的內容重覆造輪子,提高開發效率。作為大型網站架構中最重要的中間件,服務化框架簡化了服務調用所涉及的對象序列化與反序列化,通信協議,服務路由等操作,以及到後來誕生的一個新名詞—服務治理,去梳理服務的依賴關係、調用鏈路、強弱依賴等等更複雜的問題。
除此之外,在架構師的武器庫中,還有眾多不同應用場景下使用的中間件,如消息中間件、 分散式數據訪問層、配置管理中心、數據遷移工具、分散式文件系統等等,這些都是日常系統架構中的粘合劑。大型網站的另外一個核心技術就是資源的虛擬化,從實體機到Xen、KVM再到基於LXC的輕量級虛擬化方案,再到Docker,技術的更新換代使得資源的利用率越來越高,集群的運維、部署和管理越來越方便。
另外不同的場景下如何選擇存儲也十分重要,高併發和大數據往往都不會單獨出現,到底是採用磁碟、SSD還是採用記憶體,到底是採用分散式文件系統,關係資料庫,還是NOSQL,還是採用記憶體分散式緩存,不同的場景下方案會大相徑庭,分散式文件系統存儲容量幾乎可以理解為無限,但是吞吐低,關係型資料庫有嚴謹的schema以及功能強大的SQL語句,可以滿足各種複雜的查詢條件,但無奈擴展太麻煩,為了應對高併發讀寫訪問,master-slave、讀寫分離、分庫分表一折騰,不僅工作量大增,且查詢維度受限,還需要引入垂直化搜索引擎來擴展查詢維度,NOSQL雖然能自動分區擴容,但無奈不支持SQL,而緩存雖快,記憶體條又太貴,架構就是要不斷的權衡取捨。
大公司之所以不如小公司響應速度快,原因在於大公司有太多積累,有時候積累多了也會成為包袱,現有的模型會使得新業務難以快速融入。當遇到問題和挫折的時候,就是思考改進和系統變革的時候,從來沒有哪個系統在設計好之後就封存代碼永不改變的,技術永遠是不斷發展,需求和市場也是不斷變化的,因此不要指望用一種架構滿足所有的需求,系統設計需要滿足一段時間內的可擴展性,但千萬不要過度設計,因為過了半年之後你回過頭來重新review,你會發現需求早已改變,這就是互聯網的快節奏。
對於系統的架構來說,一段時間之內架構的演變,常常會經歷從清晰,再到模糊混亂,再重構,再清晰,然後又變得模糊的過程,市場環境總是瞬息萬變的,因此,系統的設計要遵循對擴展開放,對修改封閉的原則,做到這點即可方便及時的接入新流程,又能夠不影響既有的流程。從巨集觀來看,各個系統間的關係一定不是煙囪與煙囪的關係,而是猶如城市裡的高樓大廈,通過公路連接起來,因此,要提高建房子的速度,就要充分利用已有的基礎設施,已有的中間件,來降低系統構建的成本和風險。
架構設計的幾個層次,沒有架構也是架構,專註於解決現有問題也能稱為架構,而好的架構應該是即能夠約束開發者又能夠解放開發者使其專註於功能的設計。儘量將複雜的事情變的簡單,而不要將簡單的事情變的複雜,技術從來都不是用來炫的,而是用來解決實際問題的,因此我們不需要花拳繡腿,洛克希德·馬丁公司的著名飛機設計師凱利·約翰遜所提出的KISS原則,就是最好的詮釋。風險驅動的架構理念告訴我們,避免失敗是所有工程技術的核心,架構也是技術,運用架構技術去緩解風險,避免走極端,是架構師的最根本職責。
微信公眾號:IT哈哈。