“12306”是如何支撐百萬QPS的?

老許


首先是分佈式架構,全網CDN加速技術,數據庫應該是oracle或者DB2的,數據庫應該是訂單數據庫,用戶數據庫,車輛運行線路庫,車票庫,代理商窗口管理用戶庫,日誌庫,通過幾個庫的關聯查詢,並下單購票。

每個庫都有備份。這樣相當於幾個數據庫同時協作,小型系統一般就一個庫,幾個表,也能做到高併發。它這樣的架構部署,既高效又節省費用。


i呂不為


個人簡單談一下百萬QPS下的12306如何架構,算是拋磚引玉,下圖是我畫的一張網絡拓撲圖:

我們知道當國慶節、春節來臨的時候,12306會在每天的早上8點、12點、16點等各個時間點放票,這時候在極短的時間內湧入大量的流量請求,可是說是中國互聯網甚至世界互聯網上最大的高併發請求量了。

網絡要承受的住

那首先要保證的就是網絡不能掛,大家都先不用考慮服務端具體業務怎麼實現的,應該首先要考慮的是多大的網絡帶寬能夠承受住這麼大的請求量?

我們常用的方式就是一個域名解析到一個ip地址,這個ip有可能是SLB,或者我們自己裝的nginx,然後通過slb再將請求均衡分發到我們的服務器上,這是最簡單常見的負載均衡策略。

但是這樣的單臺機器負載均衡是不可能承受的住12306千百萬級高併發的。所以必須在域名解析處做好DNS負載均衡,再搭建好SLB集群和Nginx集群,且是多個集群,不同的集群去處理不同的業務。大家可以看到圖中網絡層,第一步也是最重要的一步就是要把所有的流量均攤出來,避免單機器甚至單集群無法承受住網絡流量的瞬時轟炸導致網站癱瘓。


車票查詢

車票查詢是最核心的業務,也是請求量最大的業務,不僅僅自家網站的大量請求查詢,還有一個第三方開發的搶票軟件也在不斷地請求12306的車票查詢業務。

下面有別的答主回答說需要用緩存,這是必然的,但也在抱怨明明有票但是就是顯示沒票,或者顯示有票下單時候就提示沒票了。這不是說12306的緩存一致性有問題,或者說這塊只保證高併發了,對一致性就肯定做不到強一致性了。

分佈式系統中的CAP理論大家應該都知道,CAP理論只能同時滿足CP和AP或者CA,其中分區容忍性不可拋棄,那就剩CP和AP了。所以無法做到高併發高可用的同時還得做到強一致性。

另外12306也不是一次就放票出來的,需要保證車站有票、各個小站點保留一部分票,再分時間段逐次發放,既然做不到所有人都可以買到自己最想買到的那一張票,那就保證整體大部分用戶買票體驗嘛。

核心就是分流

大家都知道國家在治理洪水的時候,會在河流的各個地方設立大壩,逐級控制水流量,而不會把所有的水都蓄在一個地方,水位低的時候,一個大壩就搞定了,水位高的時候,各級大壩都儲蓄一部分水,控制整體的洪流,這樣就很少發生嚴重的大範圍的洪災了。

網絡也是如此,將整體的網絡流量請求逐級分發、均衡到各層,能在這層處理的就不要在傳遞到下一層,儘量保證整體的服務高可用,即使損失一些強一致性,只要保證最終的一致性就好了。

這裡我沒有講各個點的技術細節,只說了個人理解的一個整體思想,按照這個思路去做整體的架構,每一個環節做到編碼質量最優、高可用、高併發,再整體串起來,即可承載百萬QPS的訪問。

以上就是個人的一些拙見,當然實際上的12306遠比我說的這些要複雜的多。這裡就當拋磚引玉了,歡迎各位大佬批評指正,討論學習,共同成長!

我是【Java架構設計】,關注我,持續為您提供優質內容!


java架構設計


我想從兩個方面回答這個問題:

1、緩存的使用。大部分通過12306買票的人都有這樣的經歷,明明顯示有票,但是下單的時候就提示餘票不足,這就是緩存的副作用。不過使用緩存卻也有很大的好處,極大降低了數據庫的讀取壓力,可以支持更大的讀吞吐量。對於買票這種場景也是讀遠高於寫,特別是節假日的車票,很多人一直在刷,實際能下單的卻很少。不過個人認為12306的緩存更新機制應該還有提升空間,目前的緩存更新還是有點慢。

2、隊列的使用。購買節假日車票的時候也會經常遇到排隊的情況,最終有可能買不到票。12306將買票需求加入到隊列,然後一個個的處理,先到先得,這樣可以極大的降低數據庫的併發寫壓力,而且沒有破壞公平原則。

還有一些朋友提到12306使用了阿里雲,阿里雲因為本身擁有很多的雲計算資源,可以按需購買,對於節假日的購票高峰,12306服務可以很快速的水平擴展,滿足業務需要,這也是其能夠支撐百萬併發的一個很重要因素。


波斯碼說


從我掌握的消息,12306採用混合雲架構,最耗資源的其實是餘票查詢,這一塊阿里雲和電信雲差不多各佔一半,交易那塊就屬於自己的私有云。


嘉怡老豆


最耗資源的一個是餘票查詢,一個是高峰訂單寫入,第二個比較容易滿足,隊列再加上橫向拓展處理服務即可,餘票查詢很麻煩,涉及到訂單,路線圖等內容的關聯查詢,oracle rac可以滿足橫向拓展資源,但是結構設計和優化需要有寫入和查詢的平衡點,再有就是定期的歸檔業務庫,保證業務庫的數據量在可控的範圍內

隊列服務也比較重要,消息內容不能太重,還需要一定程度的持久化


想早睡的臭小子


分時段放票,讀寫分離,這是阿里多年促銷活動的經驗分享


大祭司灬


你確定那種系統能支持


AnonymousWhoosah


12306餘票查詢系統依託阿里雲的算法實現大併發情況下的數據處理,可以支撐當前突發的大流程訂票業務,阿里雲威武


健康人類


題目就有問題,百萬說小了


分享到:


相關文章: