學架構筆記8和9:架構設計三原則以及案例

編程和架構最大的區別是“不確定性”,編程寫出來的程序是確定的,而不同的架構可能都適合於某個場景。

由於不同的架構都可能或看似可能適用於需求,或者團隊成員又更熟悉某種技術棧,多種選擇困難症壓在架構師身上。這些選擇哪一種都可能正確,但是哪一種合適卻沒有一套通用的規範,大多數都是依賴經驗和直覺。

三個原則

合適原則

在設計架構的時候,不能總是瞄準著大廠的水準,總是想成為業界領先。但往往這樣會忽略了業務的實際需求,而放大了工作量,導致失敗。

  1. 往往沒有業務量,就不會有太多的人力資源去支撐“大架構”
  2. 業界頂尖的架構都是通過逐步完善得出的
  3. 好的架構不是想出來的,是業務場景和壓力的情況下逼出來的

脫離了業務,空談架構反而做不出成績。

簡單原則

團隊壓力有時會有意無意地促進我們走向複雜,如Zookeeper的主備策略讓人總比心跳更高大上,導致更多的人覺得更可靠而選擇更復雜的方案。

軟件領域的複雜性體現在結構的複雜性和邏輯的複雜性。

結構的複雜性

結構複雜的系統一般有以下特點:

  1. 組件數量多
  2. 組件之間的關係複雜
  3. 定位組件問題困難

對於解決結構複雜性的問題,我們第一想法是將組件數量減少,但是過少也會引入新問題。

邏輯的複雜性

如果當個組件(或對象或函數)的邏輯過於複雜,也會帶來問題。比如可擴展性問題、協作問題。

通常,企業發展起來構架的第一次改革都是因為組件過於複雜,需要對系統進行分割。

功能複雜的組件還有可能採用了複雜的算法,導致難以理解、難以改進。

演化原則

據說,軟件架構起源於建築學。但是建築一旦完成就不可變,而軟件卻還要根據業務的發展不斷地變化。

而架構本質上不能一成不變,因為業務總是在變化。因此,也不會說照搬了某個企業的架構就能一勞永逸。

軟件架構都需要經歷以下過程:

  1. 設計出來的架構滿足當前業務
  2. 架構不斷迭代,取其精華去其糟粕
  3. 也許要重構重寫,但是總有東西能延續

案例

淘寶

淘寶技術發展經歷了“個人網站”-> “Oracle/支付寶/旺旺”->“Java時代1.0”->“Java時代2.0”->“Java時代3.0”->“分佈式時代”

個人網站

2003年,淘寶趕著上線,就直接買一個產品和服務。沒有太多的時間去考慮性能、穩定性什麼的,因為項目落地、快速上線、搶佔市場就是第一需求。

學架構筆記8和9:架構設計三原則以及案例

這裡淘寶其實遵循著“合適原則”和“簡單原則”。

Oracle/支付寶/旺旺

此時距離之前的上線還只是半年不到,根據“合適原則”和“簡單原則”,最簡單的方式還是買買買。

由於網購火爆,業務劇增,MySQL撐不住了,於是換成了Oracle,容量大、穩定、安全、性能高。

而數據量大存儲不足,則購買NAS,在加上Oracle RAC實現負載均衡。

學架構筆記8和9:架構設計三原則以及案例

Java時代1.0

起初選擇Java的原因是:PHP連接Oracle的開源庫(SQL Relay)總是死鎖。

PHP + Apache每次請求都會對數據庫產生一個鏈接,沒有連接池,如此性能低效,因此選擇了SQL Relay。

而這個技術的問題嚴重影響了業務的發展,不得不解決。

回顧這次改革,選擇Java同時也算是打開了人才的道路,因為招聘比Java好不少。

學架構筆記8和9:架構設計三原則以及案例

Java時代2.0

業務發展到這個時間,買買買已經不能解決容量、性能、成本問題了。

在性能問題上,Oracle也始終沒有文本搜索的性能,而成本問題更是致命的。

根據“演化原則”,技術人員需要回顧並重構。

學架構筆記8和9:架構設計三原則以及案例

淘寶也做了很多優化工作,如數據分庫、放棄EJB、引入Spring、加入緩存、加入CDN等等。

Java時代3.0

此時業務規模足以讓技術人員去IOE(IBM、Oracle、EMC),就是開始了自研技術,可以大幅度地降低技術成本。

手機QQ

手機QQ的發展粗略分為四個階段:十萬級、百萬級、千萬級、億級。基本上是用戶規模上去,產生問題,倒逼技術架構升級。

十萬級

最開始的手機QQ後臺是一個普通的架構,遵循著“合適原則”和“簡單原則”。

學架構筆記8和9:架構設計三原則以及案例

百萬級

2001年,QQ同時在線人數突破一百萬,存在問題:

  1. 接入服務器性能吃緊,內存不足
  2. CPU、網卡帶寬、流量到了瓶頸
  3. 單臺服務器支持不了所有的在線用戶(註冊用戶也存不下)

按照“演化原則”,進行重構:

學架構筆記8和9:架構設計三原則以及案例

千萬級

2005年,QQ同時在線人數突破千萬,出現新問題:

  1. 同步流量太大,狀態同步服務器遇到了單機瓶頸
  2. 在線狀態信息量太大導致單臺服務器存儲不足
  3. 單臺狀態同步服務器支撐不了所有的在線用戶
  4. 單臺接入服務器支撐不了所有在線用戶的在線狀態信息

架構再一次“演化”:

學架構筆記8和9:架構設計三原則以及案例

億級

2010年,QQ同時在線人數過億,出現問題:

  1. 靈活性差,功能擴展困難
  2. 無法支撐某些關鍵功能
  3. 之前一直在原基礎上升級,現在需要重新設計

於是,“演化”出新架構

存儲架構:

學架構筆記8和9:架構設計三原則以及案例

通信架構:

學架構筆記8和9:架構設計三原則以及案例

總結

學習了面對“不確定性”時架構設計的三個原則以及兩個案例。

先這樣吧

若有錯誤之處請指出。

最後:

給大家分享資深架構師錄製的視頻:(有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構)等這些成為架構師必備的內容,還有阿里大牛直播講解技術!

學架構筆記8和9:架構設計三原則以及案例

後臺私信回覆“架構” 就可以免費獲得這些視頻資料!


分享到:


相關文章: