1. 程式人生 > >阿里千萬級高效能、高併發架構的經驗之談

阿里千萬級高效能、高併發架構的經驗之談

架構以及我理解中架構的本質

在開始談我對架構本質的理解之前,先談談對今天技術沙龍主題的個人見解,千萬級規模的網站感覺數量級是非常大的,對這個數量級我們戰略上 要重 視 它 , 戰術上又 要 藐 視 它。先舉個例子感受一下千萬級到底是什麼數量級?現在很流行的優步(Uber),從媒體公佈的資訊看,它每天接單量平均在百萬左右, 假如每天有10個小時的服務時間,平均QPS只有30左右。對於一個後臺伺服器,單機的平均QPS可以到達800-1000,單獨看寫的業務量很簡單 。為什麼我們又不能說輕視它?第一,我們看它的資料儲存,每天一百萬的話,一年資料量的規模是多少?其次,剛才說的訂單量,每一個訂單要推送給附近的司機、司機要並

發搶單,後面業務場景的訪問量往往是前者的上百倍,輕鬆就超過上億級別了。

今天我想從架構的本質談起之後,希望大家理解在做一些建構設計的時候,它的出發點以及它解決的問題是什麼。

架構,剛開始的解釋是我從知乎上看到的。什麼是架構?有人講, 說架構並不是一 個很 懸 乎的 東西 , 實際 上就是一個架子 , 放一些 業務 和演算法,跟我們的生活中的晾衣架很像。更抽象一點,說架構其 實 是 對 我 們 重複性業務 的抽象和我 們 未來 業務 拓展的前瞻,強調過去的經驗和你對整個行業的預見。

我們要想做一個架構的話需要哪些能力?我覺得最重要的是架構師一個最重要的能力就是你要有 戰 略分解能力。這個怎麼來看呢:

第一,你必須要有抽象的能力,抽象的能力最基本就是去重,去重在整個架構中體現在方方面面,從定義一個函式,到定義一個類,到提供的一個服務,以及模板,背後都是要去重提高可複用率。

第二, 分類能力。做軟體需要做物件的解耦,要定義物件的屬性和方法,做分散式系統的時候要做服務的拆分和模組化,要定義服務的介面和規範。

第三, 演算法(效能),它的價值體現在提升系統的效能,所有效能的提升,最終都會落到CPU,記憶體,IO和網路這4大塊上。

這一頁PPT舉了一些例子來更深入的理解常見技術背後的架構理念。

第一個例子,在分散式系統我們會做 MySQL分 庫 分表,我們要從不同的庫和表中讀取資料,這樣的抽象最直觀就是使用模板,因為絕大多數SQL語義是相同的,除了路由到哪個庫哪個表,如果不使用Proxy中介軟體,模板就是價效比最高的方法。

第二看一下加速網路的CDN,它是做速度方面的效能提升,剛才我們也提到從CPU、記憶體、IO、網路四個方面來考慮,CDN本質上一個是做網路智慧排程優化,另一個是多級快取優化。

第三個看一下服務化,剛才已經提到了,各個大網站轉型過程中一定會做服務化,其實它就是做抽象和做服務的拆分。第四個看一下訊息佇列,本質上還是做分類,只不過不是兩個邊際清晰的類,而是把兩個邊際不清晰的子系統通過佇列解構並且非同步化。

新浪微博整體架構是什麼樣的

接下我們看一下微博整體架構,到一定量級的系統整個架構都會變成三層,客戶端包括WEB、安卓和IOS,這裡就不說了。

接著還都會有一個介面層, 有三個主要作用:

第一個作用,要做 安全隔離,因為前端節點都是直接和使用者互動,需要防範各種惡意攻擊;

第二個還充當著一個 流量控制的作用,大家知道,在2014年春節的時候,微信紅包,每分鐘8億多次的請求,其實真正到它後臺的請求量,只有十萬左右的數量級(這裡的資料可能不準),剩餘的流量在介面層就被擋住了;

第三,我們看對 PC 端和移 動 端的需求不一樣的,所以我們可以進行拆分。介面層之後是後臺,可以看到微博後臺有三大塊:

一個是 平臺服 務,

第二, 搜尋,

第三, 大資料。

到了後臺的各種服務其實都是處理的資料。 像平臺的業務部門,做的就是 資料儲存和讀 取,對搜尋來說做的是 資料的 檢 索,對大資料來說是做的資料的 挖掘。微博其實和淘寶是很類似

微博其實和淘寶是很類似的。一般來說,第一代架構,基本上能支撐到使用者到 百萬 級別,到第二代架構基本能支撐到 千萬 級別都沒什麼問題,當業務規模到 億級別時,需要第三代的架構。

從 LAMP 的架構到面向服 務 的架構,有幾個地方是非常難的,首先不可能在第一代基礎上通過簡單的修修補補滿足使用者量快速增長的,同時線上業務又不能停, 這是我們常說的 在 飛 機上 換 引擎的 問題。前兩天我有一個朋友問我,說他在內部推行服務化的時候,把一個模組服務化做完了,其他部門就是不接。我建議在做服務化的時候,首先更多是偏向業務的梳理,同時要找準一個很好的切入點,既有架構和服務化上的提升,業務方也要有收益,比如提升效能或者降低維護成本同時升級過程要平滑,建議開始從原子化服務切入,比如基礎的使用者服務, 基礎的短訊息服務,基礎的推送服務。 第二,就是可 以做無狀 態 服 務,後面會詳細講,還有資料量大了後需要做資料Sharding,後面會將。 第三代 架構 要解決的 問題,就是使用者量和業務趨於穩步增加(相對爆發期的指數級增長),更多考慮技術框架的穩定性, 提升系統整體的效能,降低成本,還有對整個系統監控的完善和升級。

總結

這裡以Java語言為例,首先一定要 理解 JAVA;第二步,JAVA完了以後,一定要 理 解 JVM;其次,還要 理解 作業系統;再次還是要了解一下 Design Pattern,這將告訴你怎麼把過去的經驗抽象沉澱供將來借鑑;還要學習 TCP/IP、 分散式系 統、資料結構和演算法。

程式設計師一定要通過不停的學習、練習和總結, 形成自己的一套架構設計原則和方法!

如何一起學習,有沒有免費資料?

 

歡迎工作一到五年的 Java 的工程師朋友們加入的 Java 架構開發:697-579-751

本群提供免費的學習指導架構資料以及免費的解答

不懂得問題都可以在本群提出來之後還會有職業生涯規劃以及面試指導