2019年即將過(guò)去,過(guò)年回家的火車(chē)票,你們買(mǎi)到了嗎?
我知道你們很多人都沒(méi)有買(mǎi)到,我能感受到你們內(nèi)心的絕望。
前幾天12306崩了,很多人在痛罵12306,還有很多人在我公眾號(hào)的后臺(tái)問(wèn)我為什么12306總是動(dòng)不動(dòng)就崩潰,和大姨媽一樣不給力。
明明只是一個(gè)簡(jiǎn)單的賣(mài)票軟件,怎么搞成這個(gè)鬼樣子,人家QQ微信幾億人同時(shí)在線聊天,激情互動(dòng),還有各種小視頻。
另一邊雙十一幾億人同時(shí)購(gòu)物瘋狂敗家剁手都沒(méi)有問(wèn)題,為什么12306一出手,就是炸穿褲衩的用戶體驗(yàn)?
讓硬核的半佛老師來(lái)給你們科普一下,12306到底面臨多大的業(yè)務(wù)壓力和挑戰(zhàn)。
你們這么多人一擁而上,他們當(dāng)然受不了,誰(shuí)受得了呢?
雖然本篇文章會(huì)有大量極為硬核的技術(shù)術(shù)語(yǔ),但是我會(huì)說(shuō)的盡量簡(jiǎn)單,大家一定要認(rèn)真聽(tīng),多記筆記,過(guò)年在飯桌上吹牛的時(shí)候,這都是王炸,不用謝我了。
不是說(shuō)你看了這篇文章就能買(mǎi)到票,實(shí)際上買(mǎi)票是一個(gè)玄學(xué)。
只是說(shuō),能死得明白點(diǎn)。
很多人拿12306和雙十一來(lái)比較,認(rèn)為雙十一這么多訂單都能撐住,12306就撐不住,顯然是因?yàn)榧夹g(shù)水平不到位。
這一開(kāi)始就走了彎路了朋友,12306的業(yè)務(wù)模式和雙十一是有本質(zhì)不同的。
這種不同,就導(dǎo)致了12306的難度要比雙十一大的多的多的多多多~
如果說(shuō)雙十一的難度是人間模式,那么12306差不多相當(dāng)于是地獄十八層,還要再挖個(gè)坑的難度。
第一,雙十一的流量再大,也只不過(guò)是純線上業(yè)務(wù),什么叫純線上業(yè)務(wù)?所有用戶都是在網(wǎng)頁(yè)或者APP下單,整個(gè)數(shù)據(jù)其實(shí)是閉環(huán)的。
這就導(dǎo)致雙十一其實(shí)只是一個(gè)純粹的線上流量問(wèn)題,解決起來(lái)相對(duì)純粹,就像一個(gè)單純的小朋友一樣好欺負(fù)。
而12306不是,12306不是只有一個(gè)APP和網(wǎng)站的朋友,所有人在線下售票廳以及線下機(jī)器里產(chǎn)生的交易,也會(huì)影響整個(gè)12306的數(shù)據(jù)系統(tǒng)。
實(shí)際上現(xiàn)實(shí)生活中非常多的買(mǎi)火車(chē)票返鄉(xiāng)的人,例如辛苦的農(nóng)民和工人朋友,很多都是不會(huì)線上操作的,他們只會(huì)線下徹夜排隊(duì),非常辛苦,所以12306也必須照顧他們的感受,不能斷掉線下業(yè)務(wù)。
這就導(dǎo)致了12306本身是一個(gè)線下與線上同享數(shù)據(jù)的復(fù)雜業(yè)務(wù),復(fù)雜度要高出雙十一一個(gè)數(shù)量級(jí)的。
和純粹簡(jiǎn)單的雙十一相比,12306就像一個(gè)飽經(jīng)社會(huì)摧殘的老油條,你永遠(yuǎn)不知道他們會(huì)什么時(shí)候會(huì)出現(xiàn)什么幺蛾子。
這就像一個(gè)純潔男孩第一次和他的男朋友約會(huì),怕他不來(lái),又怕他亂來(lái)。
第二,拋開(kāi)線上線下不說(shuō),畢竟這是欺負(fù)12306,我們談?wù)剺I(yè)務(wù)本身的計(jì)劃性和可預(yù)測(cè)性。
如果認(rèn)真思考,你會(huì)發(fā)現(xiàn),雙十一是一個(gè)有明確計(jì)劃和操作節(jié)點(diǎn)的業(yè)務(wù),而12306不是。
雙十一活動(dòng)并不是只有11月11號(hào)當(dāng)天,其實(shí)是一個(gè)月前甚至幾個(gè)月前就已經(jīng)開(kāi)始了,大量的用戶都已經(jīng)支付了定金,大量的商家也已經(jīng)鎖定了庫(kù)存和銷(xiāo)售額,只不過(guò)最終的結(jié)算是在11月11號(hào)當(dāng)天進(jìn)行的而已。
這就代表著,雙十一面對(duì)的是一個(gè)高確定性的任務(wù),只要有確定性,流量再大也不是特別難的問(wèn)題。
當(dāng)你知道困難會(huì)在什么時(shí)候發(fā)生的時(shí)候,這個(gè)困難就不再困難了。
真正的困難,在于不可知。
什么叫不可知?12306就是不可知。
因?yàn)槟阌肋h(yuǎn)不可能測(cè)算出會(huì)有多少人在哪一天去哪一個(gè)地方,一個(gè)從浙江回山東的人,他為了回家,選擇的線路和時(shí)間會(huì)非常詭異多變。
他可以買(mǎi)浙江到山東,可以買(mǎi)浙江到成都到山東,可以買(mǎi)浙江到南京到山東,可以買(mǎi)千島湖到山東,可以買(mǎi)浙江到成都到山東,可以買(mǎi)浙江到黑龍江到山東,甚至可以買(mǎi)浙江到廣東再飛回山東,只要能回山東,啊我的大蔥。
他可以接受1號(hào)出發(fā),2號(hào)出發(fā),3號(hào)出發(fā),5號(hào)出發(fā),10086號(hào)出發(fā),只要能出發(fā)。
這就代表了誰(shuí)也不知道需求的流量會(huì)是多么的突發(fā),購(gòu)買(mǎi)的內(nèi)容會(huì)是多么復(fù)雜。
我再舉一個(gè)例子大家就懂了,微博厲害吧?每天這么大的流量,這么多的關(guān)注度。
但是為什么經(jīng)常突然一個(gè)明星出軌或者結(jié)婚或者負(fù)面新聞,微博就要掛掉?是沒(méi)有技術(shù)實(shí)力還是服務(wù)器資源不夠?
都不是,是因?yàn)檫@種流量是突發(fā)性的,誰(shuí)也不知道會(huì)突然出現(xiàn)這種爆炸增長(zhǎng),所以服務(wù)器就掛掉了。
這就和潑水節(jié)上大家都做好了心理準(zhǔn)備,但是你潑開(kāi)水一樣。
這誰(shuí)遭得住啊。
所以建議所有明星出軌之前,先微博報(bào)備一下,這樣他們出軌的放心,我們吃瓜吃的也安心。
他好,我也好。
第三,電商業(yè)務(wù)不是一個(gè)一次性要完成所有流程的業(yè)務(wù),但是12306必須一次性完成,這進(jìn)一步加大了難度。
大家思考一下,電商購(gòu)物,實(shí)際上是并不是一次性的。
一個(gè)典型的電商購(gòu)物流程是,瀏覽,和商家撕逼價(jià)格,下單,和商家撕逼運(yùn)費(fèi)以及快遞,物流發(fā)貨,買(mǎi)家收貨,和商家撕逼售后。
即使排除撕逼這些事情,電商購(gòu)物流程也是有很多節(jié)點(diǎn)的。
整個(gè)流程下來(lái)最快最快次日達(dá)也要24小時(shí)。
這就代表電商的數(shù)據(jù)壓力沒(méi)有想象中那么大,可以異步處理,完全可以先全部付款完成,然后再慢慢處理發(fā)貨,然后再慢慢處理售后。
就像你要刷B站,又要燒開(kāi)水,你完全可以先燒開(kāi)水,在燒水的過(guò)程中刷B站,這就是異步的好處,可以同時(shí)多任務(wù)并行,而且不影響用戶的核心體驗(yàn)。
你下單后3小時(shí)發(fā)貨和5小時(shí)發(fā)貨,不影響用戶,容錯(cuò)率高。
而12306不一樣,賣(mài)票就是要立刻完成。
從下單,到付款,到鎖定票,都是一氣呵成的,沒(méi)有任何緩沖時(shí)間,不存在我下單一個(gè)票2天后告訴我成功或者失敗這種事情,頭都給消費(fèi)者打爆。
所以12306等于是沒(méi)有這種緩沖周期,需要直面所有的流量,在最短時(shí)間內(nèi)滿足所有人的所有需求,所有的業(yè)務(wù)都要在極短時(shí)間內(nèi)處理完成,這就是會(huì)被一下子塞滿。
同樣是1億用戶,4個(gè)步驟,電商可以分4個(gè)步驟淡定處理,每個(gè)步驟處理1億流量,而且可以分多小時(shí),多天處理。
12306就只能一口氣處理4億,沒(méi)有緩和,這個(gè)壓力可想而知。
我們都知道,再厲害的東西,被強(qiáng)行塞滿,都是會(huì)壞掉的。
你們不要瞎想,我說(shuō)的是公路。
第四,電商業(yè)務(wù)的庫(kù)存管理是相對(duì)簡(jiǎn)單的,而12306是極其復(fù)雜的,復(fù)雜到我給你簡(jiǎn)單講講你都會(huì)抑郁。
想想看,作為電商平臺(tái),管理貨物雖然也有難度,但本身的統(tǒng)籌不過(guò)固定產(chǎn)品的增刪改查,有多少就是多少,付款了就減一,上量或者退貨就加一,頂多出現(xiàn)最后一個(gè)商品被2人同時(shí)拍下的小概率事件,這都是小事兒。
而12306是完全不同的難度,二者難度差別大概相當(dāng)于草履蟲(chóng)大戰(zhàn)那美克星人。
我舉個(gè)例子,如果你是一個(gè)在成都讀書(shū)的人,家在成都南邊,過(guò)年要回家。
隨便選一輛成都往南開(kāi)的車(chē),G65這輛高鐵,成都始發(fā)終到珠海,一共17個(gè)站,共計(jì)10小時(shí)55分鐘。
就這一個(gè)路線,17個(gè)站,支持隨意站上車(chē),隨意站下車(chē),會(huì)有多少種可能性?
因?yàn)樽?chē)不可能只做單站循環(huán),就是不能成都到成都。
所以是從1加到16,一共136種可能性,注意哦,電商同樣的場(chǎng)景只有增刪改查4種可能性。
這樣一個(gè)線路的實(shí)時(shí)庫(kù)存,做起來(lái)是非常令人頭大的。
假如有人買(mǎi)了從成都到成都,那么對(duì)應(yīng)的所有庫(kù)存就要減1,但是成都到珠海的庫(kù)存不減。
假如有人買(mǎi)了從成都到珠海,那么對(duì)應(yīng)的就是成都到珠海沿途所有線路的庫(kù)存減1,但是成都到成都不減。
假如有人買(mǎi)了石家莊到漯河西,那么成都到保定,成都到石家莊不用變,漯河西到珠海段,不用變。
其余所有可能性都要變,因?yàn)橹灰?jīng)過(guò)這兩個(gè)站點(diǎn)的路線,都受到影響。
實(shí)際業(yè)務(wù)中,這樣的變動(dòng),會(huì)導(dǎo)致整個(gè)庫(kù)存實(shí)時(shí)變動(dòng),并且是P級(jí)別的數(shù)據(jù)變動(dòng),如果對(duì)數(shù)據(jù)庫(kù)稍微有所了解,都知道這種數(shù)據(jù)變動(dòng)對(duì)于資源的消耗有多么恐怖,一個(gè)1GB的電子表格跑查詢都能把很多高性能電腦跑崩掉,早期電子表格甚至限制在6萬(wàn)5千行,就是防止把電腦跑崩。
而這種級(jí)別的數(shù)據(jù),需要消耗的資源說(shuō)出來(lái)都違反廣告法。
所以為什么12306夜里11點(diǎn)到早上要維護(hù)?這樣的數(shù)據(jù)庫(kù)如果不是天天維護(hù)保護(hù)緩存,早就徹底完?duì)僮恿恕?/p>
每一天,12306都是拿命來(lái)奮斗。
所以之后買(mǎi)票的時(shí)候,要寵溺一點(diǎn),溫柔一點(diǎn),你買(mǎi)的不是票,是工程師們的頭發(fā)。
第五,業(yè)務(wù)去重需要大量的判斷。
電商業(yè)務(wù)其實(shí)嚴(yán)格來(lái)說(shuō)是不需要用戶實(shí)名制的,也不需要對(duì)用戶的身份去重,只要你付錢(qián),有貨就發(fā)貨,除非是限購(gòu)商品稍微攔截一下,但是面對(duì)黃牛黨,也就是象征性的掙扎一下,畢竟大家都是出來(lái)賣(mài)的,不會(huì)跟錢(qián)過(guò)不去。
而12306不一樣,12306的模式是,每一個(gè)人都要限購(gòu)。
同路線,同時(shí)間,要限購(gòu)。
就拿成都到珠海舉例,12306是不允許一個(gè)人在同一天購(gòu)買(mǎi)大量成都到珠海的車(chē)票的,這對(duì)其他人不公平,所以要限制人的出發(fā)時(shí)間和購(gòu)買(mǎi)路線。
那么問(wèn)題來(lái)了,如果要加限購(gòu),那么就要把這個(gè)人的當(dāng)前購(gòu)買(mǎi)信息,時(shí)間,全部緩存下來(lái),這個(gè)人的每一筆交易,都要和他當(dāng)前的已有行程進(jìn)行去重匹配。
這對(duì)數(shù)據(jù)資源的消耗是非??植赖?。
并且,并且,查重還有另一個(gè)現(xiàn)實(shí)問(wèn)題,就是12306本身是允許非本人買(mǎi)票的,就是我可以給我的爸媽買(mǎi)票,我爸媽也可以給我買(mǎi)票,只要添加乘車(chē)人就可以了,這就代表著,同一個(gè)人的信息,完全可以在不同的時(shí)間節(jié)點(diǎn)被不同的買(mǎi)家添加,這又帶來(lái)了巨大的計(jì)算壓力。
這就和人生一樣,太難了。
第六,和12306比流量,什么公司都沒(méi)有資格。
很多人真的以為雙十一就是流量的巔峰的了,其實(shí)并不是,12306才是最恐怖的流量巔峰。
為什么?因?yàn)殡娚痰臉I(yè)務(wù)模式不會(huì)導(dǎo)致用戶重復(fù)點(diǎn)擊,而12306無(wú)時(shí)無(wú)刻不在被所有用戶重復(fù)點(diǎn)擊。
舉個(gè)例子,你在雙十一買(mǎi)東西,是不是買(mǎi)了就走了?買(mǎi)不到你就是罵幾句,然后也走了。
一個(gè)用戶的點(diǎn)擊是有限的,你就算單身30年,給你放開(kāi)了點(diǎn),你能點(diǎn)多快?
要知道對(duì)系統(tǒng)而言,每一次點(diǎn)擊,都是一次數(shù)據(jù)交換。
12306面對(duì)的點(diǎn)擊流量,要大的多,你買(mǎi)票的時(shí)候,是會(huì)不斷刷新操作的,你在查詢余票的時(shí)候,每一次都是要跑所有的數(shù)據(jù)庫(kù)來(lái)幫你同步當(dāng)前的余票信息,這個(gè)負(fù)載量和計(jì)算量是天量。
而且,現(xiàn)在非常非常多的人在用搶票軟件。
所謂的搶票軟件,原理就是不停地用機(jī)器去讀取12306的數(shù)據(jù)接口,機(jī)器的速度絕對(duì)是比你單身30年的手速還要威猛幾十倍,一秒刷幾百次,1個(gè)人用搶票軟件,可以造成幾千個(gè)人一起刷產(chǎn)生的數(shù)據(jù)壓力。
各大搶票軟件公司加起來(lái)用戶幾千萬(wàn)是有的,14億人刷出幾百億人的流量都綽綽有余。
你知道12306的流量負(fù)載有多強(qiáng)了么?
在12306上,人人都是火影忍者,天天影分身。
會(huì)有人問(wèn),既然挑戰(zhàn)這么大,12306這么不容易,那么為什么不去像國(guó)外先進(jìn)技術(shù)取經(jīng)?為什么不去加大投入服務(wù)器?為什么還在找借口?
為什么12306不引入國(guó)外的先進(jìn)技術(shù)呢?
答案其實(shí)很簡(jiǎn)單,國(guó)外也罩不住啊。
早在2012年,12306就有公開(kāi)招標(biāo),預(yù)算不設(shè)限,只要能解決問(wèn)題,世界頂級(jí)機(jī)構(gòu)都來(lái)競(jìng)標(biāo)了,但是最后基本都放棄了。
因?yàn)楫?dāng)時(shí)的技術(shù)環(huán)境沒(méi)有人能解決這個(gè)問(wèn)題。
國(guó)外很多技術(shù)的確先進(jìn),但是沒(méi)有一個(gè)國(guó)家或者公司,歷史上接受過(guò)14億人的數(shù)百億級(jí)別流量的挑戰(zhàn),你能說(shuō)出來(lái)的世界頂級(jí)公司,沒(méi)有一家能承受這么強(qiáng)的即時(shí)交易流量。
他們有的流量更大,但就和電商業(yè)務(wù)一樣,是可以異步操作,不需要身份唯一性,沒(méi)有這么復(fù)雜的路線存量計(jì)算的,你們也知道國(guó)外的高鐵和地鐵是什么垃圾水平,我們遇到的問(wèn)題他們從來(lái)沒(méi)有遇到過(guò)。
這是很現(xiàn)實(shí)的一件事情。
全中國(guó)14億人的出行需求面前,大家都是一樣菜。
說(shuō)到這里,我想到了我們行業(yè)里的一個(gè)笑話,有個(gè)臉書(shū)的早期工程師回國(guó)加入阿里巴巴,離開(kāi)前,他說(shuō)要去拯救阿里巴巴的數(shù)據(jù)系統(tǒng),結(jié)果回來(lái)之后才發(fā)現(xiàn),他在臉書(shū)遇到的數(shù)據(jù)挑戰(zhàn),和阿里巴巴比起來(lái),簡(jiǎn)直是幼兒園水平。
在數(shù)據(jù)挑戰(zhàn)上,我們遇到的數(shù)據(jù)挑戰(zhàn)絕對(duì)是世界最強(qiáng)梯隊(duì)的,很多時(shí)候沒(méi)有之一。
那么為什么不加服務(wù)器呢?技術(shù)不夠,硬件來(lái)湊。
加服務(wù)器面臨的核心問(wèn)題有3個(gè)。
第一個(gè),加服務(wù)器只是增加了儲(chǔ)存能力,并不能解決數(shù)據(jù)庫(kù)的問(wèn)題,這就和一個(gè)女人生孩子要10個(gè)月,不代表你找10個(gè)女人就能在1個(gè)月內(nèi)生孩子。
第二個(gè),如何驅(qū)動(dòng)這些服務(wù)器?當(dāng)年阿里云領(lǐng)先世界的技術(shù),就是突破了同時(shí)驅(qū)動(dòng)5000臺(tái)服務(wù)器,成為世界三大云之一。
要知道,阿里云面對(duì)的只是雙十一,而12306的挑戰(zhàn)要更加恐怖,需要同時(shí)驅(qū)動(dòng)的服務(wù)器數(shù)量更多,這也是有技術(shù)挑戰(zhàn)在的。
另外,阿里云也確實(shí)參與了12306的建設(shè)。
第三個(gè),成本問(wèn)題。
12306往往全年都表現(xiàn)良好,只有重大節(jié)假日才會(huì)偶爾出現(xiàn)崩潰,你為了應(yīng)付一年中為數(shù)不多的重大節(jié)假日,采購(gòu)了這么多高折舊率的服務(wù)器,平時(shí)根本用不上,這是一種浪費(fèi)錢(qián)的行為。
中國(guó)鐵路本身就是巨額虧損,國(guó)家持續(xù)補(bǔ)貼的,這種情況下,為了短時(shí)間的需求,投入海量的成本,這筆賬不用多說(shuō)吧?
你看看隔壁微博,寧可每次被流量擊潰也不肯長(zhǎng)時(shí)間維系大量服務(wù)器,微博看財(cái)報(bào)每年都是盈利的,金額都是按照億來(lái)結(jié)算的,人家都是這個(gè)態(tài)度,你知道12306有多不容易了吧。
而且這可都是納稅人的錢(qián)。
到最后,買(mǎi)票問(wèn)題的本質(zhì),還是供需關(guān)系。
全國(guó)這么多人,在這么短的時(shí)間內(nèi)要完成這么多的出行,遠(yuǎn)遠(yuǎn)超過(guò)了鐵路本身的運(yùn)載能力,在這種供小于求的情況下,怎么調(diào)配資源,都沒(méi)有辦法解決供需問(wèn)題。
東西就這么多,大家都想要,能怎么辦呢?
加錢(qián),繼續(xù)擴(kuò)建?
要知道很多線路只有春節(jié)才爆滿,平時(shí)都空車(chē)虧損,為了滿足小部分人短時(shí)間的出行,大量浪費(fèi)資金投入到已經(jīng)富余的路線中,并不劃算的。
有這個(gè)錢(qián),應(yīng)該去投入到更多的地方。
12306這種基礎(chǔ)設(shè)施,天然就是挨罵的,做的好,大家不會(huì)夸,做的有一點(diǎn)點(diǎn)不好,會(huì)被罵到死,這是基礎(chǔ)設(shè)施的悲哀,所有人都有不合理的期待。
何況,12306在只花了這么少預(yù)算的情況下,做到現(xiàn)在這個(gè)程度,已經(jīng)是超神操作了。
不考慮資金成本和技術(shù)成本張口就罵,是一種不太理智的行為。
怎么不去說(shuō)人家印度火車(chē)賣(mài)掛票呢?
作者:半佛仙人
公眾號(hào):仙人JUMP(ID:xrtiaotiao)
136 0806 8886【加微信請(qǐng)注明來(lái)意】
四川省成都市高新區(qū)天府三街1599號(hào)(天府三街與南華路交匯處)