為什麼 12306 時不時要崩一下?

csdn程序人生 發佈 2020-01-10T07:09:16+00:00

作者 | 半佛仙人本文經授權轉載自仙人JUMP(ID:xrtiaotiao)春節即將到來,過年回家的火車票,你們買到了嗎?我知道你們很多人都沒有買到,我能感受到你們內心的絕望。

作者 | 半佛仙人

本文經授權轉載自仙人JUMP(ID:xrtiaotiao)

春節即將到來,過年回家的火車票,你們買到了嗎?

我知道你們很多人都沒有買到,我能感受到你們內心的絕望。

前幾天12306崩了,很多人在痛罵12306,還有很多人在公眾號的後台問我為什麼12306總是動不動就崩潰,和大姨媽一樣不給力。

明明只是一個簡單的賣票軟體,怎麼搞成這個鬼樣子,人家QQ微信幾億人同時在線聊天,激情互動。

另一邊雙十一幾億人同時購物瘋狂敗家剁手都沒有問題,為什麼12306一出手,就是炸穿褲衩的用戶體驗?

讓硬核的半佛老師來給你們科普一下。

12306到底面臨多大的業務壓力和挑戰。

你們這麼多人一擁而上,他們當然受不了,誰受得了呢。

雖然本篇文章會有大量極為硬核的技術術語,但是我會說的儘量簡單,大家一定要認真聽,多記筆記,過年在飯桌上吹牛的時候,這都是王炸,不用謝我了。

不是說你看了這篇文章就能買到票,實際上買票是一個玄學。

只是說,能「死」的明白點。

很多人拿12306和雙十一來比較,認為雙十一這麼多訂單都能撐住,12306就撐不住,顯然是因為技術水平不到位。

這一開始就走了彎路了朋友,12306的業務模式和雙十一是有本質不同的。

這種不同,就導致了12306的難度要比雙十一大的多的多的多多多~

如果說雙十一的難度是人間模式,那麼12306差不多相當於是地獄十八層,還要再挖個坑的難度。

第一,雙十一的流量再大,也只不過是純線上業務,什麼叫純線上業務?所有用戶都是在網頁或者APP下單,整個數據其實是閉環的。

這就導致雙十一其實只是一個純粹的線上流量問題,解決起來相對純粹,就像一個單純的小朋友一樣好欺負。

而12306不是,12306不是只有一個APP和網站的朋友,所有人在線下售票廳以及線下機器里產生的交易,也會影響整個12306的數據系統。

實際上現實生活中非常多的買火車票返鄉的人,例如辛苦的農民和工人朋友,很多都是不會線上操作的,他們只會線下徹夜排隊,非常辛苦,所以12306也必須照顧他們的感受,不能斷掉線下業務。

這就導致了12306本身是一個線下與線上同享數據的複雜業務,複雜度要高出雙十一一個數量級的。

和純粹簡單的雙十一相比,12306就像一個飽經社會摧殘的老油條,你永遠不知道他們會什麼時候會出現什麼么蛾子。

這就像一個純潔男孩第一次和他的男朋友約會,怕他不來,又怕他亂來。

第二,拋開線上線下不說,畢竟這是欺負12306,我們談談業務本身的計劃性和可預測性。

如果認真思考,你會發現,雙十一是一個有明確計劃和操作節點的業務,而12306不是。

雙十一活動並不是只有11月11號當天,其實是一個月前甚至幾個月前就已經開始了,大量的用戶都已經支付了定金,大量的商家也已經鎖定了庫存和銷售額,只不過最終的結算是在11月11號當天進行的而已。

這就代表著,雙十一面對的是一個高確定性的任務,只要有確定性,流量再大也不是特別難的問題。

當你知道困難會在什麼時候發生的時候,這個困難就不再困難了。

真正的困難,在於不可知。

什麼叫不可知?12306就是不可知。

因為你永遠不可能測算出會有多少人在哪一天去哪一個地方,一個從浙江回山東的人,他為了回家,選擇的線路和時間會非常詭異多變。

他可以買浙江到山東,可以買浙江到上海到山東,可以買浙江到南京到山東,可以買千島湖到山東,可以買浙江到北京到山東,可以買浙江到黑龍江到山東,甚至可以買浙江到廣東再飛回山東,只要能回山東,啊我的大蔥。

他可以接受1號出發,2號出發,3號出發,5號出發,10086號出發,只要能出發。

這就代表了誰也不知道需求的流量會是多麼的突發,購買的內容會是多麼複雜。

我再舉一個例子大家就懂了,微博厲害吧?每天這麼大的流量,這麼多的關注度。

但是為什麼經常突然一個明星出軌或者結婚或者負面新聞,微博就要掛掉?是沒有技術實力還是伺服器資源不夠?

都不是,是因為這種流量是突發性的,誰也不知道會突然出現這種爆炸增長,所以伺服器就掛掉了。

這就和潑水節上大家都做好了心理準備,但是你潑開水一樣。

這誰遭得住啊。

所以建議所有明星出軌之前,先微博報備一下,這樣他們出軌的放心,我們吃瓜吃的也安心。

他好,我也好。

第三,電商業務不是一個一次性要完成所有流程的業務,但是12306必須一次性完成,這進一步加大了難度。

大家思考一下,電商購物,實際上是並不是一次性的。

一個典型的電商購物流程是,瀏覽,和商家撕逼價格,下單,和商家撕逼運費以及快遞,物流發貨,買家收貨,和商家撕逼售後。

即使排除撕逼這些事情,電商購物流程也是有很多節點的。

整個流程下來最快最快次日達也要24小時。

這就代表電商的數據壓力沒有想像中那麼大,可以異步處理,完全可以先全部付款完成,然後再慢慢處理髮貨,然後再慢慢處理售後。

就像你要刷B站,又要燒開水,你完全可以先燒開水,在燒水的過程中刷B站,這就是異步的好處,可以同時多任務並行,而且不影響用戶的核心體驗。

你下單後3小時發貨和5小時發貨,不影響用戶,容錯率高。

而12306不一樣,賣票就是要立刻完成。

從下單,到付款,到鎖定票,都是一氣呵成的,沒有任何緩衝時間,不存在我下單一個票2天後告訴我成功或者失敗這種事情,頭都給消費者打爆。

所以12306等於是沒有這種緩衝周期,需要直面所有的流量,在最短時間內滿足所有人的所有需求,所有的業務都要在極短時間內處理完成,這就是會被一下子塞滿。

同樣是1億用戶,4個步驟,電商可以分4個步驟淡定處理,每個步驟處理1億流量,而且可以分多小時,多天處理。

12306就只能一口氣處理4億,沒有緩和,這個壓力可想而知。

第四,電商業務的庫存管理是相對簡單的,而12306是極其複雜的,複雜到我給你簡單講講你都會抑鬱。

想想看,作為電商平台,管理貨物雖然也有難度,但本身的統籌不過固定產品的增刪改查,有多少就是多少,付款了就減一,上量或者退貨就加一,頂多出現最後一個商品被2人同時拍下的小機率事件,這都是小事兒。

而12306是完全不同的難度,二者難度差別大概相當於草履蟲大戰那美剋星人。

我舉個例子,如果你是一個在北京讀書的人,家在北京南邊,過年要回家。

隨便選一輛北京往南開的車,G65這輛高鐵,北京始發終到珠海,一共17個站,共計10小時55分鐘。

就這一個路線,17個站,支持隨意站上車,隨意站下車,會有多少種可能性?

因為坐車不可能只做單站循環,就是不能北京到北京。

所以是從1加到16,一共136種可能性,注意哦,電商同樣的場景只有增刪改查4種可能性。

這樣一個線路的實時庫存,做起來是非常令人頭大的。

假如有人買了從北京到廣州,那麼對應的所有庫存就要減1,但是廣州到珠海的庫存不減。

假如有人買了從武漢到珠海,那麼對應的就是武漢到珠海沿途所有線路的庫存減1,但是北京到武漢不減。

假如有人買了石家莊到漯河西,那麼北京到保定,北京到石家莊不用變,漯河西到珠海段,不用變。

其餘所有可能性都要變,因為只要經過這兩個站點的路線,都受到影響。

實際業務中,這樣的變動,會導致整個庫存實時變動,並且是P級別的數據變動,如果對資料庫稍微有所了解,都知道這種數據變動對於資源的消耗有多麼恐怖,一個1GB的電子表格跑查詢都能把很多高性能電腦跑崩掉,早期電子表格甚至限制在6萬5千行,就是防止把電腦跑崩。

而這種級別的數據,需要消耗的資源說出來都違反廣告法。

所以為什麼12306夜裡11點到早上要維護?這樣的資料庫如果不是天天維護保護緩存,早就徹底完犢子了。

每一天,12306都是拿命來奮鬥。

所以之後買票的時候,要寵溺一點,溫柔一點,你買的不是票,是工程師們的頭髮。

第五,業務去重需要大量的判斷。

電商業務其實嚴格來說是不需要用戶實名制的,也不需要對用戶的身份去重,只要你付錢,有貨就發貨,除非是限購商品稍微攔截一下,但是面對黃牛黨,也就是象徵性的攔截,大多數不會跟錢過不去。

而12306不一樣,12306的模式是,每一個人都要限購。

同路線,同時間,要限購。

就拿北京到珠海舉例,12306是不允許一個人在同一天購買大量北京到珠海的車票的,這對其他人不公平,所以要限制人的出發時間和購買路線。

那麼問題來了,如果要加限購,那麼就要把這個人的當前購買信息,時間,全部緩存下來,這個人的每一筆交易,都要和他當前的已有行程進行去重匹配。

這對數據資源的消耗是非常恐怖的。

並且,並且,查重還有另一個現實問題,就是12306本身是允許非本人買票的,就是我可以給我的爸媽買票,我爸媽也可以給我買票,只要添加乘車人就可以了,這就代表著,同一個人的信息,完全可以在不同的時間節點被不同的買家添加,這又帶來了巨大的計算壓力。

這就和人生一樣,太難了。

第六,和12306比流量,什麼公司都沒有資格。

很多人真的以為雙十一就是流量的巔峰的了,其實並不是,12306才是最恐怖的流量巔峰。

為什麼?因為電商的業務模式不會導致用戶重複點擊,而12306無時無刻不在被所有用戶重複點擊。

舉個例子,你在雙十一買東西,是不是買了就走了?買不到你就是罵幾句,然後也走了。

一個用戶的點擊是有限的,你就算單身30年,給你放開了點,你能點多快?

要知道對系統而言,每一次點擊,都是一次數據交換。

12306面對的點擊流量,要大的多,你買票的時候,是會不斷刷新操作的,你在查詢余票的時候,每一次都是要跑所有的資料庫來幫你同步當前的余票信息,這個負載量和計算量是天量。

而且,現在非常非常多的人在用搶票軟體。

所謂的搶票軟體,原理就是不停地用機器去讀取12306的數據接口,一秒刷幾百次,1個人用搶票軟體,可以造成幾千個人一起刷產生的數據壓力。

各大搶票軟體公司加起來用戶幾千萬是有的,14億人刷出幾百億人的流量都綽綽有餘。

你知道12306的流量負載有多強了麼?

在12306上,人人都是火影忍者,天天影分身。

會有人問,既然挑戰這麼大,12306這麼不容易,那麼為什麼不去像國外先進技術取經?為什麼不去加大投入伺服器?為什麼還在找藉口?

為什麼12306不引入國外的先進技術呢?

答案其實很簡單,國外也罩不住啊。

早在2012年,12306就有公開招標,預算不設限,只要能解決問題,世界頂級機構都來競標了,但是最後基本都放棄了。

因為當時的技術環境沒有人能解決這個問題。

國外很多技術的確先進,但是沒有一個國家或者公司,歷史上接受過14億人的數百億級別流量的挑戰,你能說出來的世界頂級公司,沒有一家能承受這麼強的即時交易流量。

他們有的流量更大,但就和電商業務一樣,是可以異步操作,不需要身份唯一性,沒有這麼複雜的路線存量計算的,你們也知道國外的高鐵和地鐵是什麼垃圾水平,我們遇到的問題他們從來沒有遇到過。

這是很現實的一件事情。

全中國14億人的出行需求面前,大家都是一樣菜。

說到這裡,我想到了我們行業里的一個笑話,有個臉書的早期工程師回國加入阿里巴巴,離開前,他說要去拯救阿里巴巴的數據系統,結果回來之後才發現,他在臉書遇到的數據挑戰,和阿里巴巴比起來,簡直是幼兒園水平。

在數據挑戰上,我們遇到的數據挑戰絕對是世界最強梯隊的,很多時候沒有之一。

那麼為什麼不加伺服器呢?技術不夠,硬體來湊。

加伺服器面臨的核心問題有3個。

第一個,加伺服器只是增加了儲存能力,並不能解決資料庫的問題,這就和一個女人生孩子要10個月,不代表你找10個女人就能在1個月內生孩子。

第二個,如何驅動這些伺服器?當年阿里雲領先世界的技術,就是突破了同時驅動5000台伺服器,成為世界三大雲之一。

要知道,阿里雲面對的只是雙十一,而12306的挑戰要更加恐怖,需要同時驅動的伺服器數量更多,這也是有技術挑戰在的。

另外,阿里雲也確實參與了12306的建設。

第三個,成本問題。

12306往往全年都表現良好,只有重大節假日才會偶爾出現崩潰,你為了應付一年中為數不多的重大節假日,採購了這麼多高折舊率的伺服器,平時根本用不上,這是一種浪費錢的行為。

中國鐵路本身就是巨額虧損,國家持續補貼的,這種情況下,為了短時間的需求,投入海量的成本,這筆帳不用多說吧?

你看看隔壁微博,寧可每次被流量擊潰也不肯長時間維繫大量伺服器,微博看財報每年都是盈利的,金額都是按照億來結算的,人家都是這個態度,你知道12306有多不容易了吧。

而且這可都是納稅人的錢。

到最後,買票問題的本質,還是供需關係。

全國這麼多人,在這麼短的時間內要完成這麼多的出行,遠遠超過了鐵路本身的運載能力,在這種供小於求的情況下,怎麼調配資源,都沒有辦法解決供需問題。

東西就這麼多,大家都想要,能怎麼辦呢?

加錢,繼續擴建?

要知道很多線路只有春節才爆滿,平時都空車虧損,為了滿足小部分人短時間的出行,大量浪費資金投入到已經富餘的路線中,並不划算的。

有這個錢,應該去投入到更多的地方。

12306這種基礎設施,天然就是挨罵的,做的好,大家不會夸,做的有一點點不好,會被罵到死,這是基礎設施的悲哀,所有人都有不合理的期待。

何況,12306在只花了這麼少預算的情況下,做到現在這個程度,已經是超神操作了。

不考慮資金成本和技術成本張口就罵,是一種不太理智的行為。

怎麼不去說人家印度火車賣掛票呢?

關鍵字: