高性能後臺服務器架構設計

如何設計高性能的大型網站系統?在移動互聯網時代,客戶端應用開發本身,並不是體驗的決勝之處,真正對團隊挑戰的地方,還在於後端,無論是承壓能力,還是安全性等方面,如果這些地方過不了關,整個應用的基礎是不紮實的。

    提高服務器性能最簡單粗暴的方式,就是增加機器和升級硬件配置。雖然現在的硬件越來越便宜,但是一味地通過增加機器來解決併發量的增長,成本是非常高昂的。結合技術優化方案,纔是更有效的解決方法。


一、web端性能

    這幾年,用戶數量並沒有出現指數增長,而併發連接數呈指數增長的主要原因是:1、Web頁面元素越來越多,更爲豐富;2、主流的本瀏覽器的預加載功能。

    (1)、建立長連接。減少反覆的創建和銷燬連接行爲。但是,連接的保持是會佔用Web系統服務端資源的,如果不充分使用這個連接,會導致資源浪費。

    (2)、通過緩存減少Web請求。通過Http協議頭中的expire或max-age來控制,將靜態內容放入瀏覽器的本地緩存。但是,這種方案,對首次訪問的用戶無效,同時,也影響部分Web資源的實時性。

    (3)、通過版本號減輕Web請求。協商方式是通過Http協議的Last-Modified或Etag來控制,這個時候請求服務器,如果是內容沒有發生變更的情況,服務器會返回304 Not Modified。但是,,但是連接仍然被建立,請求也發生了。

    (4)、合併頁面請求。1、合併HTML展示內容。將CSS和JS直接嵌入到HTML頁面內,不通過連接的方式引入。2、Ajax動態內容合併請求。對於動態內容,將10次Ajax請求合併爲1次的批量信息查詢。3、小圖片合併,通過CSS的偏移量技術Sprites,將很多小圖片合併爲一張。4、壓縮css,js,圖片的大小。

    (5)、頁面靜態化。頁面上的大部分內容在很長一段時間內,可能都是沒有變化的。例如一篇新聞報道,一旦發佈幾乎是不會修改內容的。這樣的話,通過CGI生成的靜態html頁面緩存到web服務器的磁盤本地。

 

二、app端性能。
      (1)圖片三步加載。從內存、磁盤、網絡三個方面上進行三級緩存的實現。1、在加載一張圖片的時候,先查看內存是否有該圖片的緩存,若無,再查看磁盤時候有該圖片的緩存,若無,才從網絡中加載;2、在網絡加載完成之後,需要把圖片加進到內存和磁盤緩存中;3、根據LRU調度方式對緩存進行管理。

       (2)預加載技術。基於歷史瀏覽記錄和對該網頁的安全性判斷,在你沒點擊請求之前,預先加載這個數據。

    (3)路由計劃表。對用戶每天登陸的上網行爲和不同行爲連接哪個機房,做了一個路由計劃表,推送到客戶終端上。當用戶的網絡發生切換,我們就知道這個網絡情況下他應該連到哪裏最快。

    (4)上傳加速。在全國部署了超過70個上傳加速節點,讓每個用戶都會選擇他最近的上傳節點上傳他的圖片。同時有啓用多端口、多連接的上傳加速能力,可以儘可能的用盡網絡資源,而不是說在一個連接上不停的等待數據包的重傳等各方面的東西。


三、帶寬

    計算帶寬要涉及到兩個指標(頁面平均大小、全天pv), 可以從access日誌統計到詳細數據。平均流量 = (全天pv/(24*60*60)) * 頁面平均大小。峯值流量 = 平均流量 * 5。需購買的帶寬等於峯值流量。

    但是活動日的峯值流量遠不止這個數。2015年微信紅包除夕搖一搖總次數110億次,峯值1400萬次/秒。應對活動日,需提前在活動當天CDN將準備數百G帶寬應對。


四、後臺性能。

    大型網站不是設計出來的,而是逐步演化出來的。因爲互聯網發展運行有其自己的規律,互聯網歷史已經一再證明“一開始就把網站設計成大型的”這種企圖行不通。另外,演化過程中,需要分清當前哪個點是瓶頸,需要知道哪個點優化的優先級最高。所以,技術架構的演進不一定就是按文章從頭到尾這樣列下來的,要視具體情況來下決定。

    從一個小網站說起,一臺服務器也就足夠了。演進包括如下:

    (1) 數據服務器和應用服務器分離。給應用服務器配置更好的 CPU,內存。而給數據服務器配置更好更大的硬盤。

    (2)使用緩存。因爲 80% 的業務訪問都集中在 20% 的數據上,如果我們能將這部分數據緩存下來,性能一下子就上來了。空數據也要入緩存,否則會增加數據庫的壓力。

    (3)nosql。NoSql數據庫大量應用於微博系統等事務性不強的系統。如:BigTable、MongoDB 

    (4)服務器集羣。需要考慮:負載均衡問題? 負載均衡調度服務器,如nginx。Session 的管理問題。如何讓上傳文件這些類似的功能繼續正常?採用文件服務器統一管理。

    (5)數據庫讀寫分離。訂閱和發佈。實現一個數據訪問模塊使上層寫代碼的人不知道讀寫分離的存在。需要考慮:時延問題。MySQL數據同步是通過binlog日誌。延遲問題通過水平拆分服務來提高性能、多線程同步解決。

    (6)數據庫拆分。垂直拆分數據庫時,會遇到的問題:跨業務的事務,應用的配置項多了。數據水平拆分會遇到的問題:SQL 的路由問題,需要知道某個 User 在哪個數據庫上。主鍵的策略會有不同。查詢時的性能問題,如分頁問題。

    (7)CDN。分佈式文件系統使用 CDN 。將網站的內容發佈到最接近用戶的網絡”邊緣”,使用戶可以就近取得所需的內容,解決Internet網絡擁塞狀況,提高用戶訪問網站的響應速度。據統計,採用CDN技術,能處理整個網站頁面的 70%~95%的內容訪問量,減輕服務器的壓力,提升了網站的性能和可擴展性。異地部署一般遵循:核心集中,節點分散。如:網宿、睿江、藍訊,將網站內容同步到全國CDN節點,客戶就近訪問CDN服務器。

    (8)分佈式拆分。網站的業務日益複雜,建立一個獨立的大型應用來完成這所有的業務變得不實際。從管理角度來,也不方便管理。將系統根據職責進行拆分,同時也能採用大量的廉價機器來支撐着巨大的訪問量和數據量。微服務架構的優勢很明顯:耦合度低、技術選型靈活、發佈更加高效、故障隔離。拆分會碰到很多的挑戰:1、拆成分佈式後需要提供一個高性能、穩定的通信框架,並且需要支持多種不同的通信和遠程調用方式;2、將一個龐大的應用拆分需要耗費很長的時間,需要進行業務的整理和系統依賴關係的控制等;3、如何運維(依賴管理、運行狀況管理、錯誤追蹤、調優、監控和報警等)好這個龐大的分佈式應用。

    (9)大系統小做。將功能複雜較大的系統,化大爲小,減少模塊耦合,降低關聯性。分成一個個高度自制的小系統,形成高內聚低耦合的格局,每個模塊之間不會過分依賴對方,這樣的好處是不會因爲任何一個模塊而影響全部服務,避免牽一髮動全身的風險,實現真正的灰度服務。 

    (10) 硬件負載均衡。一臺Nginx服務器的軟負載已經無法承擔巨大的web訪問量了,可以用硬件負載解決F5或應用從邏輯上做一定的分類,然後分散到不同的軟負載集羣中。


五、業務方式

    有些問題用技術手段並不比用業務手段更有效。12306 的分時賣票就是一個典型例子。

    (1)前端緩衝請求。比方說在接入層置入搖紅包邏輯,將每秒千萬級請求轉化爲每秒萬級的紅包請求,再傳到紅包服務的後端邏輯,降低雪崩的可能性。

    (2)後端採用異步分拆。耗時最長的入賬操作,直接跳過,異步處理。如:“當前人數較多,收到的紅包將稍後入賬零錢”

    (3)快速拒絕。在客戶端的版本更新中,將相關的指令和策略埋入,當接受數據獲取異常時,在客戶端自動就降低請求頻率,比如一次請求失敗,用戶肯定想二次再刷,但是可能實際上沒有向後端請求,而是直接返回,請客戶稍安勿躁,如果不提前埋入,到有問題時才處理是來不及的。

    (4)流量預加載。從客戶端入手,將語音圖片等極消耗流量的資源提前讓客戶端自動下載預置好,提前將流量洪峯疏導。

    (5)資源隔離。避免任意一個支路出問題影響整個服務鏈條,這樣即使部分服務出現問題也不會影響到整個服務的崩塌。

    (6)根據業務場景降低圖片質量。1、針對不同終端,下載不同質量圖片。2、研究新的編碼格式,使得圖片在基本同等質量情況下再下降30%。3、應用一些漸進式的傳輸技術,你會首先看到模糊的圖,一會兒清晰的圖就會出現。

    (7)回滾機制會造成業務邏輯複雜,容易出錯,可能會出現漏洞。我們應該提高服務的簡單性、高可用性,減少出錯率。對於極少的錯誤,後續對日誌進行單獨處理即可。


六、最大連接數限制

    (1)全程壓測流程,對整個業務鏈接進行自動提前評估,防止過載。

    (2)柔性可用要求我們對各種特性一開始就是分好級別(登錄>文本消息>圖片消息>好友狀態呈現>鍵盤活動提示)。

    (3)模塊間調用的超時時間如果設置不合理,會導致柔性策略失效。A調用B是300ms超時,B調用C是500ms超時;B對c有柔性,調用c超時的時候會柔性的繼續往下,但是這個沒有意義。

    (4)如果成功率高於95%,纔可以重試,否則接口層拒絕。


參考文獻:

1、大型網站技術架構的演進  http://news.cnblogs.com/n/518851/

2、高併發Web服務的演變  http://www.admin10000.com/document/6190.html

3、網站服務架構 http://www.cnblogs.com/jiekzou/p/4677994.html

4、微信產品經理和架構師們是靠什麼扛住了10億個紅包?  http://www.woshipm.com/pmd/138987.html

5、解密騰訊億級產品背後的網絡架構故事  http://news.idcquan.com/news/66660.shtml

6、爲什麼Chrome瀏覽器特愛吃內存  http://www.admin10000.com/document/6318.html

7、大型網站技術架構:核心原理與案例分析,李智慧


原文:http://blog.sina.com.cn/s/blog_3fba24680102vpvx.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章