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