只是用支付寶和12306比較,其實(shí)是不恰當(dāng)?shù)摹?2306的邏輯復(fù)雜程度遠(yuǎn)遠(yuǎn)高于支付寶,所以我們先換一個(gè)思維吧,用雙11的天貓和12306做比較吧。
2017年的雙11,天貓交易量達(dá)到了1682億元,并且也沒(méi)有出現(xiàn)問(wèn)題。但是,12306沒(méi)到春運(yùn),就連接不通暢,是什么原因呢?
這就需要從兩個(gè)系統(tǒng)賣(mài)的東西開(kāi)始說(shuō)起了。
我們都知道,天貓賣(mài)的是實(shí)體的商品,這些商品(SKU)都是有庫(kù)存量的,也就是下圖所示的這個(gè)內(nèi)容。
用戶每買(mǎi)一個(gè)商品,這個(gè)庫(kù)存就相應(yīng)的減少1,到減少到0的時(shí)候,庫(kù)存就沒(méi)了,后面的人也就買(mǎi)不到了。
這個(gè)是一個(gè)非常簡(jiǎn)單的邏輯,其中的核心,就是SKU(最小庫(kù)存單元),對(duì)于天貓來(lái)說(shuō),SKU也就是一件商品。
天貓2016年的時(shí)候,統(tǒng)計(jì)自己擁有940萬(wàn)商家,超10億件商品,數(shù)量是非常龐大的。但是每一件這樣的商品的庫(kù)存都是可以統(tǒng)計(jì)出來(lái)的,而且任何一個(gè)商品銷(xiāo)售的時(shí)候,并不會(huì)影響到其他的商品。
商品量大庫(kù)存系統(tǒng),我就多增加硬件來(lái)存儲(chǔ)這些商品就行了,所以技術(shù)上的難度并不是特別大。
但是12306不一樣,我去查了一下中國(guó)的鐵路運(yùn)行情況。
根據(jù)2017年初的數(shù)據(jù),中國(guó)列車(chē)車(chē)次一共有3500余對(duì),鐵路站點(diǎn)2000多個(gè)。
也就是說(shuō),每天,會(huì)有7000余次的列車(chē)在中國(guó)的鐵路上行為,途經(jīng)這2000多個(gè)點(diǎn)。
對(duì)于任何電商網(wǎng)站來(lái)說(shuō),SKU都是核心,那12306也算是電商網(wǎng)站,他的商品是什么呢?就是火車(chē)票,火車(chē)票對(duì)應(yīng)的是什么呢?火車(chē)上的座位或者站位。
那SKU就是座位了。
對(duì)于天貓來(lái)說(shuō),商品賣(mài)一個(gè)少一個(gè)。
對(duì)12306來(lái)說(shuō),一列火車(chē)上的座位,賣(mài)一個(gè)他不一定少一個(gè)。因?yàn)槲乙涣谢疖?chē)可能途經(jīng)20個(gè)站點(diǎn),一個(gè)人可能始發(fā)站上車(chē),第三站下車(chē),那這個(gè)SKU在1-3站之間被賣(mài)掉了,但是第4站的時(shí)候,它又回來(lái)了。我還可以繼續(xù)賣(mài)。
但是也可能一個(gè)人直接買(mǎi)了始發(fā)站到終點(diǎn)站,我這個(gè)SKU就完全賣(mài)掉了,回不來(lái)了。
用戶買(mǎi)的行為,決定著我SKU的剩余情況,而用戶買(mǎi)的行為是一個(gè)不可控的行為。
如果在沒(méi)有控制策略的情況下,就意味著,SKU是隨時(shí)發(fā)生著變化的。
我們來(lái)簡(jiǎn)單算一筆賬。
一列火車(chē)途經(jīng)20個(gè)點(diǎn),車(chē)上有5000個(gè)座位,那他理論最小庫(kù)存就是5000(一個(gè)座位1張票,始發(fā)—終點(diǎn)),最大庫(kù)存是95000(所有人都只坐1站)
但是對(duì)于用戶來(lái)說(shuō),他只是關(guān)心他那一站作為起點(diǎn)的時(shí)候,剩余的票的數(shù)量,這樣的話,我們就必須計(jì)算,火車(chē)行進(jìn)到他所在站的時(shí)候,車(chē)票的剩余情況(包括未購(gòu)買(mǎi)的和要下車(chē)的),這樣,每有一張火車(chē)票銷(xiāo)售出去,計(jì)算機(jī)就需要執(zhí)行復(fù)雜的運(yùn)算,來(lái)重新的定義SKU和庫(kù)存量。
中國(guó)有超過(guò)10億人在春運(yùn)的時(shí)候會(huì)去12306搶票,7000余次的列車(chē),這個(gè)運(yùn)算的復(fù)雜程度是非比尋常的。
可以說(shuō),現(xiàn)在中國(guó)的互聯(lián)網(wǎng)中,暫時(shí)還沒(méi)有能夠比12306還復(fù)雜的運(yùn)算場(chǎng)景了。
我們假設(shè),買(mǎi)一張票需要運(yùn)算1秒鐘,有100臺(tái)服務(wù)器同時(shí)工作,也就是1秒可以買(mǎi)100張票。一天可以處理多少?gòu)埰蹦兀?,640,000(864萬(wàn)張票),我相信,春運(yùn)開(kāi)始的第一天,中國(guó)至少有1億人回去12306搶票吧,如果我們真的使用這種算法,那就意味著有9000多萬(wàn)人,可能連搶票頁(yè)面張什么都看不到。
但實(shí)際上是這樣么?
并不是的,12306是設(shè)置了放票的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)進(jìn)行放票,也就是說(shuō),12306會(huì)按照以往的數(shù)據(jù)經(jīng)驗(yàn),對(duì)車(chē)票進(jìn)行預(yù)演算,在不同的線路之間按照一定比例,先將票的庫(kù)存計(jì)算出來(lái)。然后進(jìn)行販賣(mài)。
在下一個(gè)節(jié)點(diǎn)的時(shí)候,會(huì)再次按照這個(gè)規(guī)則,對(duì)車(chē)票的余量進(jìn)行統(tǒng)計(jì)和計(jì)算,保證在每個(gè)節(jié)點(diǎn)時(shí),各個(gè)站點(diǎn)的票都是有的,而且票與票之間的銷(xiāo)售不會(huì)相互干擾,這樣就可以減少在銷(xiāo)售期間的運(yùn)算次數(shù)的減少,提高效率。
如此說(shuō)來(lái),在節(jié)點(diǎn)的間隔時(shí)間內(nèi),12306的下單復(fù)雜度和天貓是一樣的了,為什么春運(yùn)時(shí)候,它還是要會(huì)打不開(kāi)頁(yè)面庫(kù)存系統(tǒng),沒(méi)有響應(yīng)呢?
我們就可以看到12306和天貓另一個(gè)不同的地方了。
12306是實(shí)名制的,一人一票,但是天貓可以隨便買(mǎi),所以,12306在下單前后有比較多的身份驗(yàn)證,但是天貓并不需要,所以,12306的單個(gè)訂單的處理復(fù)雜度還是高于天貓的。
而且,全世界沒(méi)有任何一個(gè)系統(tǒng),在一個(gè)時(shí)間節(jié)點(diǎn)的時(shí)候,會(huì)涌進(jìn)來(lái)好幾億人。12306能安安全全的票賣(mài)出去,我覺(jué)得已經(jīng)很強(qiáng)大了。