技術專家支招12306.cn性能優化

碼頭工人 12年前發布 | 10K 次閱讀 12306

每年春運都是一件牽動人心的大事,電子商務大勢所趨,今年春運我們終于迎來了傳統購票方式之外的另一個選擇——12306. cn。不過這個新選擇并沒有讓大家的回家之路變得順暢多少,只是把一部分人的“戰場”從寒風中或者電話旁換到了互聯網上,各種工具、插件齊上陣,只為買到一張票,網友將它戲稱為“中國最牛電商”、“電商嚴冬中的一朵奇葩”。

我們相信鐵道部原本是想讓 12306.cn 為大家服務的,不過就目前該網站的表現來看,實在是差強人意。鐵路購票系統的細節我們不得而知,筆者也不清楚那非常特別的“海量事務高速處理系統”究竟為何物,但相信該系統在某些地方還是有別于大家所熟知的互聯網系統的。針對鐵路購票網站無法應對購票客流的話題,在微博和博客中引發了熱烈的討論,眾多網友紛紛出謀劃策,提出了很多優化的建議。

游戲技術專家云風早些時候發表了博文《鐵路訂票系統的簡單設計》,其中提出了一種基于排隊系統的設計方案,排隊是網游中比較常用的一種手段,這里將購票網站比作購票窗口,需要購票的用戶必須先排隊,最后排到的用戶才能進行實際的購票操作。藉此提升站點穩定性,避免大量社會資源浪費在無效的網絡購票流程上。在文章最后,云風認為:

因為鐵路購票系統很多年前就實現了內部網絡化,有成熟系統支撐,運作多年。這次做互聯網版本,一定不能放棄原有系統新來一套。[..]所以要做的僅僅是怎么做一個系統和原有系統對接。

4399首席架構師曹政也撰寫了一篇《鐵路訂票網站個人的設計淺見》,他將網站的主要需求分為三部分,即車次查詢與余票顯示、用戶注冊與登錄,以及下單。文中以緩存為切入點,提出了一些建議:

  • 針對查詢,存儲結構 KV 化,推薦 Redis 之類的 NoSQL 存儲
  • 車次及車票余量的查詢結果要緩存化、靜態化
  • 應對 10 億級別的請求,在前端也需要做緩存處理
  • I/O優化

緩存化、靜態化并不是不做動態更新,總之,目標就是讓絕大多數的請求都落到緩存中,降低后端服務器的壓力,讓它們能有更多的資源處理真正的購票請求。

知名博客酷殼作者、亞馬遜中國技術經理陳皓從 12306.cn 的性能問題入手,介紹了一些常用的性能優化技術。雖然其中的一些東西受到了質疑,不過全文還是能讓讀者了解到性能優化的諸多內容。首先,從業務上分析了 12306.cn 與 QQ、網游、秒殺、奧運票務系統的區別,認為它和電子商務的訂單系統比較相似,而且鐵路票務中的突然放票做法非常恐怖。隨后,分前端和后端兩部分展開詳細說明。

前端優化技術常用的有:

  • 前端負載均衡,通過 CDN 及 DNS 負載均衡器分散壓力
  • 減少前端鏈接數,例如可以合并 CSS、JS 和圖標文件
  • 減少網頁大小增加帶寬
  • 前端頁面靜態化
  • 優化查詢,可以考慮使用 NoSQL 技術
  • 緩存動態頁面和查詢數據

后端優化技術主要是:

  • 數據冗余
  • 數據鏡像,可提高可用性,便于負載均衡
  • 數據分區,比如按照火車票的信息分區存放數據
  • 后端系統負載均衡,建議由下游的計算服務器去任務服務器上拿任務
  • 異步和批量處理,比如可以使用隊列進行排隊
  • 限流,這是系統的一種自我保護手段

關于云風提出的排隊方法,陳皓也做了一些補充,例如,如何防范攻擊,隊列的一致性和等待時間等等。陳皓強調

無論你怎么設計,你的系統一定要能容易地水平擴展。

上述的技術不是一朝一夕能搞定的,沒有長期的積累,基本無望。

上面的一些討論都是圍繞技術展開的,在 Google+ 上,霍矩、云風和劉新生(o6z)的討論同樣精彩,o6z 指出僅從技術入手無法解決根本的問題:

做這些項目不是應該先設計,而是應該先業務,特別是應該先了解清楚他們現在的系統構件情況。[..]這不僅僅是 Web 的問題,而是要先從業務下手。[..]構架師不是一個技術角色,做的不是技術決策,而是業務和商業決策。

除此之外,還有一些文章也值得一讀,例如這篇《建設一個靠譜的火車票網上訂購系統》。不知讀者您又有何想法?值此新春佳節之際,希望每位讀者都能順利買到車票,與家人共度新春。來自: InfoQ

 本文由用戶 碼頭工人 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!