編程和架構最大的區別是“不確定性”,編程寫出來的程序是確定的,而不同的架構可能都適合於某個場景。
由於不同的架構都可能或看似可能適用於需求,或者團隊成員又更熟悉某種技術棧,多種選擇困難症壓在架構師身上。這些選擇哪一種都可能正確,但是哪一種合適卻沒有一套通用的規範,大多數都是依賴經驗和直覺。
三個原則
合適原則
在設計架構的時候,不能總是瞄準著大廠的水準,總是想成為業界領先。但往往這樣會忽略了業務的實際需求,而放大了工作量,導致失敗。
- 往往沒有業務量,就不會有太多的人力資源去支撐“大架構”
- 業界頂尖的架構都是通過逐步完善得出的
- 好的架構不是想出來的,是業務場景和壓力的情況下逼出來的
脫離了業務,空談架構反而做不出成績。
簡單原則
團隊壓力有時會有意無意地促進我們走向複雜,如Zookeeper的主備策略讓人總比心跳更高大上,導致更多的人覺得更可靠而選擇更復雜的方案。
軟件領域的複雜性體現在結構的複雜性和邏輯的複雜性。
結構的複雜性
結構複雜的系統一般有以下特點:
- 組件數量多
- 組件之間的關係複雜
- 定位組件問題困難
對於解決結構複雜性的問題,我們第一想法是將組件數量減少,但是過少也會引入新問題。
邏輯的複雜性
如果當個組件(或對象或函數)的邏輯過於複雜,也會帶來問題。比如可擴展性問題、協作問題。
通常,企業發展起來構架的第一次改革都是因為組件過於複雜,需要對系統進行分割。
功能複雜的組件還有可能採用了複雜的算法,導致難以理解、難以改進。
演化原則
據說,軟件架構起源於建築學。但是建築一旦完成就不可變,而軟件卻還要根據業務的發展不斷地變化。
而架構本質上不能一成不變,因為業務總是在變化。因此,也不會說照搬了某個企業的架構就能一勞永逸。
軟件架構都需要經歷以下過程:
- 設計出來的架構滿足當前業務
- 架構不斷迭代,取其精華去其糟粕
- 也許要重構重寫,但是總有東西能延續
案例
淘寶
淘寶技術發展經歷了“個人網站”-> “Oracle/支付寶/旺旺”->“Java時代1.0”->“Java時代2.0”->“Java時代3.0”->“分佈式時代”
個人網站
2003年,淘寶趕著上線,就直接買一個產品和服務。沒有太多的時間去考慮性能、穩定性什麼的,因為項目落地、快速上線、搶佔市場就是第一需求。
![學架構筆記8和9:架構設計三原則以及案例](http://p2.ttnews.xyz/loading.gif)
這裡淘寶其實遵循著“合適原則”和“簡單原則”。
Oracle/支付寶/旺旺
此時距離之前的上線還只是半年不到,根據“合適原則”和“簡單原則”,最簡單的方式還是買買買。
由於網購火爆,業務劇增,MySQL撐不住了,於是換成了Oracle,容量大、穩定、安全、性能高。
而數據量大存儲不足,則購買NAS,在加上Oracle RAC實現負載均衡。
![學架構筆記8和9:架構設計三原則以及案例](http://p2.ttnews.xyz/loading.gif)
Java時代1.0
起初選擇Java的原因是:PHP連接Oracle的開源庫(SQL Relay)總是死鎖。
PHP + Apache每次請求都會對數據庫產生一個鏈接,沒有連接池,如此性能低效,因此選擇了SQL Relay。
而這個技術的問題嚴重影響了業務的發展,不得不解決。
回顧這次改革,選擇Java同時也算是打開了人才的道路,因為招聘比Java好不少。
Java時代2.0
業務發展到這個時間,買買買已經不能解決容量、性能、成本問題了。
在性能問題上,Oracle也始終沒有文本搜索的性能,而成本問題更是致命的。
根據“演化原則”,技術人員需要回顧並重構。
淘寶也做了很多優化工作,如數據分庫、放棄EJB、引入Spring、加入緩存、加入CDN等等。
Java時代3.0
此時業務規模足以讓技術人員去IOE(IBM、Oracle、EMC),就是開始了自研技術,可以大幅度地降低技術成本。
手機QQ
手機QQ的發展粗略分為四個階段:十萬級、百萬級、千萬級、億級。基本上是用戶規模上去,產生問題,倒逼技術架構升級。
十萬級
最開始的手機QQ後臺是一個普通的架構,遵循著“合適原則”和“簡單原則”。
百萬級
2001年,QQ同時在線人數突破一百萬,存在問題:
- 接入服務器性能吃緊,內存不足
- CPU、網卡帶寬、流量到了瓶頸
- 單臺服務器支持不了所有的在線用戶(註冊用戶也存不下)
按照“演化原則”,進行重構:
千萬級
2005年,QQ同時在線人數突破千萬,出現新問題:
- 同步流量太大,狀態同步服務器遇到了單機瓶頸
- 在線狀態信息量太大導致單臺服務器存儲不足
- 單臺狀態同步服務器支撐不了所有的在線用戶
- 單臺接入服務器支撐不了所有在線用戶的在線狀態信息
架構再一次“演化”:
億級
2010年,QQ同時在線人數過億,出現問題:
- 靈活性差,功能擴展困難
- 無法支撐某些關鍵功能
- 之前一直在原基礎上升級,現在需要重新設計
於是,“演化”出新架構
存儲架構:
通信架構:
總結
學習了面對“不確定性”時架構設計的三個原則以及兩個案例。
先這樣吧
若有錯誤之處請指出。
最後:
給大家分享資深架構師錄製的視頻:(有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構)等這些成為架構師必備的內容,還有阿里大牛直播講解技術!
後臺私信回覆“架構” 就可以免費獲得這些視頻資料!
閱讀更多 JAVA技術程序員 的文章