eaby技術架構變遷

若是你對項目管理、系統架構有興趣,請加微信訂閱號「softjg」,加入這個PM、架構師的你們庭 java

 

最近在infoq上面看到 ebay介紹其系統架構變遷以及系統設計分享方面的講座,其中陳述了ebay從1995年到2006年之間系統架構的變化過程。從這裏,咱們能夠學習到許多寶貴的經驗來設計一個大容量,高併發,分佈式的系統。 web

ebay的系統架構的變遷主要經歷了4個階段,下面一幅圖展示了ebay系統架構變遷的時間表 數據庫

在ebay的V1版本,ebay採用的是FREEBSD + APACHE + PERL +DGBM,這是一個比較原始的模型,並且相對比較簡單,操做系統,應用服務器,web服務器 以及 數據庫服務器都是在同一臺機器中,網絡結構在物理上只有一層。整個網站有四個域名,每一個域名對應不一樣的應用,每組應用對應一臺服務器。 編程

圖表 1 ebayV1系統架構 緩存

隨着業務量以及訪問量的不斷上升,ebay在1999年開始對架構進行升級,技術架構發生了較大的變化,這期間主要是從1999-2004年,而架構的版本號則從V2.0到V2.5 ,下面咱們來看看Ebay V2.0技術架構 服務器

  • V2.0微信

² 開始採用ORACLE服務器,數據庫服務器和web服務器分開,數據庫獨立部署到一臺新的機器上面 網絡

² 程序邏輯上面已經開始分層,也就是咱們常說的mvc3層結構:顯示層、業務邏輯層、數據訪問層,而在物理上面仍是兩層結構 web服務器 以及 數據庫服務器 架構

² 編程語言採用C++,那個時候java剛興起,估計也沒有其餘好的語言選擇了。 併發

  • V2.1

² 每組應用對應多臺服務器,而多臺服務器組成一個 servler pool(服務池),經過一個負載均衡服務器來分別轉發請求到不一樣的服務器

² 數據庫部署到性能更加好的服務器上面

  • V2.2

² 增長了一臺數據庫服務器做爲 備份服務器,防止失敗

  • V2.3

這個版本只是對每一個應用增長了更多的服務器,不斷的進行server pool

  • V2.4

這個版本最大且最重要的改變就是對數據庫進行垂直拆分,即把數據庫按照不一樣的功能模塊進行劃分,例如交易庫,會員庫,賬務庫

  • V2.5

這個版本在2.4的版本上面,對部分數據庫進行讀寫分離,同時對Item(物品條目)數據庫進行水平拆分,把Items按照不一樣的Categoty分配到不一樣的Categoty商品庫裏面,,這樣大大的擴展了對Items數據庫的訪問性能。

圖表 2 ebayV2系統架構

從上能夠看出ebay V2的架構變遷,主要是經過服務器的添加,數據庫的垂直拆分以及水平拆分,數據庫的讀寫分離操做 來提升整個網站的性能。在web層,經過添加服務器來進行水平擴展,同時對應用服務功能進行垂直拆分,按照不一樣的業務功能劃分到不一樣的系統。在數據庫層面,進行了讀寫分離嘗試,對數據庫進行垂直拆分,同時把Items庫按照Category進行水平拆分,這樣作,分散了對產品庫items的集中訪問,不過須要在DAL層提供透明的訪問機制,ebays這裏貌似還並無這個成熟的框架,同時不知道 分佈式事務ebay在這個階段是如何實現的。

  • V3

整個應用程序開發平臺所有替換爲j2ee平臺,用java改寫了整個網站。看來是一次比較大的工做。目的是爲模塊解耦 以及模塊複用,從這裏,咱們能夠看出java在開發複雜企業應用的優點。

V3版本在數據庫層面上面作了更加優化的設計,ebay繼續在數據庫上面進行優化

垂直拆分數據庫,按照 功能模塊 拆分爲更多的子庫

水平拆分數據庫,對同一類數據,按照key值的不一樣數據分配到不一樣的數據庫中(具體水平分庫的方式有多種,這裏就再也不介紹了。)在進行水平拆分數據庫的時候,ebay也必須創建一套透明的DAL訪問方式,必須提供透明的數據庫訪問機制以及透明的數據庫路由功能,數據庫的物理結構變動不會影響到代碼的邏輯變更。

在這裏,ebay也在數據庫層給出了最佳實踐:

² 儘可能減小數據庫CPU的消耗,例如不使用存儲過程,只使用少許的觸發器

² 減小數據庫層面的邏輯功能,例如數據轉化,組合,這些都放在邏輯層

² 減小動態SQL,主要是SQL中參數的動態生成功能,這一點,公司的DBA也在強調

² 儘量的縮短數據庫的事務時間,儘量早的結束事物

² 儘量的採用異步更新數據庫方式,分散數據庫的壓力,例如消耗數據庫時間的操做要放在夜間處理。

² 不使用分佈式事務,看來分佈式事務的確不使用高併發性的系統

在應用邏輯層面,ebay把系統按照功能劃分紅許多不一樣的模塊,每一個模塊做爲一個子系統,同時經過水平擴展子系統服務器數量來提升整個系統的伸縮性。

下面看看ebay在應用層面給出的最佳實踐

² 保持應用層子系統徹底是無狀態的,能夠水平進行無限擴展以提升伸縮性,經過負載均衡服務器均等分配到各個子系統的實例池裏面。

² 儘量的使用緩存,緩存可以減小數據庫的壓力,使用空間來換時間

² 嚴格劃分系統的各個層面,表現層,業務邏輯層,服務集成層,DAO層,基礎設施層。

在應用層的設計上面,ebay經過不一樣的功能劃分了不少domain,每一個domain只負責本身的功能的業務邏輯,domain與domain之間是不會依賴的,同時還會提供common domain 提供各個 domain之間的交互以及依賴,見下圖:

因爲ebay的數據庫按照邏輯劃分了不少不一樣的字庫,那麼ebay必須提供透明的訪問數據庫的能力,舉個例子:ebay把Items按照categoray分紅了不少sub items庫,假如須要查詢出來某一個用戶所購買的全部Items,那麼必需要查詢全部的sub items庫,把數據庫組合出來,那麼DAL層必須屏蔽數據庫的物理結構,一次性的把全部的sub items庫中對應的數據查詢出來。而這個訪問,對應用來講是透明的。應用不須要關注到底items有多少個子庫。

總結:在大規模,高併發系統的設計中,最經常使用的技術就是分層和緩存,把一個業務流程垂直分解成幾個系統,每一個系統提供不一樣類型的服務,一個業務流程經過不一樣的服務組裝起來,這就是SOA設計的思路吧。每一個系統能夠進行水平集羣,提供無狀態的服務,能夠水平無線擴展,數據庫層面,主要就是用到垂直分庫,水平分庫,讀寫分離,熱備份等技術,提升數據庫的讀寫能力。在應用層能夠考慮使用集中式緩存或者分佈式緩存來減小數據庫的訪問壓力。

若是你對項目管理、系統架構有興趣,請加微信訂閱號「softjg」,加入這個PM、架構師的你們庭

相關文章
相關標籤/搜索