高併發系統設計(轉)

原文:

寒假老師讓做一個像12306訂票網站一樣高併發系統解決方案的調研,經過一番辛苦調查,發現12306的工程師們並沒有那麼差,反而心生萬分敬佩,同時這個經歷也驗證了老毛的那句話:沒有調查就沒有發言權。

一、一般高併發web系統
這裏的一般指的是秒殺之類的電子商務系統,比如說小米搶購、淘寶雙十一、秒殺活動等等,12306訂票網站與其有本質區別,下面會有說到。

系統架構圖
下圖是我調查衆多資料總結出的系統架構圖,當然這也不能作爲通用的解決方案,首先像淘寶等企業公佈的資料肯定不是最先進或者是性能最好的,其次具體情況還需具體分析。

核心技術點

  • 前端優化  前端優化主要包括動態內容靜態化,增加前端緩存。頁面靜態化是指將指含有大量動態元素的動態網頁,如jsp、php等,轉換爲html靜態頁面,靜態頁面由於不用加載動態元素,其訪問速度要比動態頁面快得多,可以增加訪問速度,減小數據庫壓力;前端頁面緩存在系統前端對Web服務器上的頁面進行緩存。
  • CDN技術  CDN即內容分發網絡,其基本思路是儘可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。通過在網絡各處放置節點服務器所構成的在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度。
  • 負載均衡  負載均衡的基本思想是把高併發的訪問平均分配到每一個服務器節點上,從而減小分佈式數據庫中每一個節點的壓力。
  • 中間件     數據庫的中間件技術是指把應用層與數據庫層分離,在中間增加一個部分,避免應用直接訪問數據庫。因爲系統可能採用讀寫分離的技術,因而會使用不同的數據庫,中間件可以屏蔽數據庫直接的不同,提供統一的接口。中間件還負責事務的協調處理,起到數據連接管理的作用,多個客戶端連接通過中間件可以共用一個數據庫連接。
  • memcached  memcached是一個高性能的分佈式內存對象緩存系統,通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度,它是基於一個存儲鍵/值對的hashmap。
  • 併發控制   數據庫限流,達到數據庫的最大併發數,進入行鎖狀態。如不進行控制,一旦其中一個連接卡住,會引發雪崩效應,從而影響整個系統
  • 排隊系統   鎖機制導致排隊
  • 並行複製   採用並行複製的技術可以解決主備庫複製延遲問題
  • 數據庫拆分  分爲水平拆分和垂直拆分,垂直拆分即按列拆分,把數據按應用分離,降低單個事務的數據處理量;水平拆分即按行拆分,降低節點的併發量
  • 讀寫分離   有些系統讀操作頻繁,而有些系統寫操作頻繁,讀寫分離能有效提高訪問速度



二、12306網站與淘寶的不同

12306的特殊性就在於其複雜性:

  • 頻繁的混合讀寫操作   
  • 座位實時複用   訂單之間關聯度較大,每賣出一張票,都需要調整整個車次所有可能區間的餘票數量

調查之前,我也很簡單的認爲,只要不停地增加節點數量,必然能解決搶票尖峯時刻的問題,其實不然,訪問速度主要受限於兩個方面,一個是CPU處理速度,另一個是磁盤I/O。而簡單的增加機器並不能解決這兩個瓶頸,相反,節點越多,數據同步的代價越大。爲了更好的解釋其特殊性,需要引入一些基本概念。

  • 事務

淘寶、12306等電子商務系統都屬於面向交易的處理系統,即OLTP。數據庫中事務(Transaction)是訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit),具有四個屬性:原子性、一致性、隔離性、持久性,簡稱爲ACID。

  •         原子性(Atomicity)  一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
  •         致性(Consistency)  事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
  •         隔離性(Isolation)  一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
  •         持久性(Durability)  持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

並行處理的核心就是隔離性,即不同的事務不能互相影響,一個用戶訂票行爲不能影響其他用戶,否則會出現看到票卻買不到票的現象。隔離要處理三個問題:髒讀、不可重複讀和幻讀保證隔離性就要對數據加鎖,而鎖會導致排隊,排隊必然會產生時延,面對千萬級別的併發,問題就產生了。所有關鍵的問題還是要提高單個事務的處理速度,即CPU,以及減小磁盤I/O的時間。12306從12年就開始進行技術改革,核心採用了Vmware Gemfire 內存數據庫技術,即把多個X86服務器虛擬成一個具有超大內存和處理速度的機器,把數據全部放在內存中計算,由內存與磁盤的I/O速度可以看出這種技術必然能大幅度提高性能。



現在想想,自己之前一想到12306就不禁要破口大罵,還說是體制問題、內部壟斷等等,真是可笑。
總之
,批評人之前先做好調查吧。

發佈了354 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章