昨天寫(xiě)了一篇關(guān)于12306系統開(kāi)發(fā)難度分析的文章,講的比較簡(jiǎn)略,今天再詳細的做一個(gè)12306與淘寶系統開(kāi)發(fā)技術(shù)難度對比。首先闡明一點(diǎn),淘寶技術(shù)比12306強大很多倍,接下來(lái)我們用詳細的數據和案例來(lái)說(shuō)明。
先說(shuō)秒殺活動(dòng)和搶購
淘寶平臺現在的專(zhuān)題秒殺活動(dòng),如淘搶購、聚劃算等活動(dòng),部分由于是超低價(jià)搶購,所以參加的活動(dòng)人數非常的多,部分單品的搶購人數可能會(huì )突破百萬(wàn)人。拿前幾年的一個(gè)數據,2013年圣誕的時(shí)候,天貓放出1.5W個(gè)天貓魔盒,所有商品在19秒內被全部搶完,此外還有一些品牌的手機,因為只在官網(wǎng)或者天貓旗艦店限量供應。
今年暑期,某品牌手機剛上架銷(xiāo)售,當時(shí)限量5000臺手機,我蹲守在電腦前面希望能搶到一部,結果就在時(shí)間剛到的那一秒,一刷新就卡住了,再刷新的時(shí)候,就顯示已經(jīng)售完。這樣的情況相信很多人都經(jīng)歷過(guò),這其實(shí)跟12306上的搶票是一樣的。淘寶在早期也一度為解決用戶(hù)擁擠的問(wèn)題而想破了腦袋。
要知道,淘寶擁有各種自主研發(fā)團隊:服務(wù)器、交換機(網(wǎng)上可以搜索到淘寶公開(kāi)的綠色服務(wù)器開(kāi)放標準);Web服務(wù)器(Tengine)、Java語(yǔ)言虛擬機(JVM taobao版)、操作系統(Linux Kernel taobao版,yunos手機操作系統是阿里云的,暫時(shí)不計入)、數據庫(MySQL內核 taobao版,google和facebook也有自己的版本,HBase淘寶版、還有自己全部從頭開(kāi)發(fā)的OceanBase)、負載均衡器(LVS,LVS始創(chuàng )人就在淘寶,擔任研究員)、Java運行容器(Jboss,其創(chuàng )始人之一,王文彬,也在淘寶,擔任副總裁)
此外,淘寶的技術(shù)團隊為了解決用戶(hù)擁擠的問(wèn)題還自己開(kāi)發(fā)了非常多的開(kāi)源項目和一些中間件,像高性能Java通信中間件HSF、分布式數據庫中間件TDDL、異步消息系統notify等,但就是這樣的淘寶,還是在流量高峰期出現卡頓的情況。
淘寶這么強大的技術(shù)還是不能解決流量高峰期的擁擠感是為什么?
第一:事物發(fā)展需要遵循物理原理,單個(gè)服務(wù)器所能承受的運算能力擁有上限(千萬(wàn)別提什么超級計算機,那個(gè)不是拿來(lái)做服務(wù)器的,你也用不起),所以必須使用集群服務(wù)器,但這就又引申出第二個(gè)問(wèn)題。
第二:考慮現實(shí)經(jīng)濟效益,用無(wú)數多個(gè)服務(wù)器組成集群,確實(shí)可以解決這些問(wèn)題,但是要知道12306和淘寶的流量都是有一定規律的。在春運期間,網(wǎng)站的峰值流量可能是平時(shí)的上千上萬(wàn)倍,如果部署過(guò)多的服務(wù)器,將會(huì )造成這些資源在平時(shí)里的極大浪費。在這一方面,淘寶會(huì )在流量不大的時(shí)候,將多余的硬件和帶寬用來(lái)做云計算。
動(dòng)態(tài)庫存
淘寶秒殺和火車(chē)搶票,其實(shí)都要考慮到一個(gè)動(dòng)態(tài)庫存,對于每一個(gè)商品(專(zhuān)業(yè)的人管它叫SKU),在每一產(chǎn)品被賣(mài)出去之后,庫存數就會(huì )減1。如果一個(gè)庫存幾萬(wàn)的產(chǎn)品在幾秒內被搶購完,可能實(shí)際產(chǎn)生的請求數已經(jīng)幾十萬(wàn)個(gè)。
而在處理這些請求時(shí),不是一個(gè)簡(jiǎn)單的http請求,服務(wù)器需要做:檢查是否惡意訪(fǎng)問(wèn)、請求時(shí)間排序、核對用戶(hù)資格、生成訂單號、庫存減少等等內容,這每一件事都要花費毫秒級別的時(shí)間,這些操作加起來(lái)的時(shí)間可能是接近1秒級別的,但由于淘寶的服務(wù)器比較強悍,而且采用了分布式和集群技術(shù),結果比1秒理想一點(diǎn)。但即使有1萬(wàn)臺服務(wù)器,也不能把這個(gè)時(shí)間稀釋成萬(wàn)分之一秒,因為,商品只有一種,比如它有一萬(wàn)個(gè)庫存,對應的數據庫記錄只有一行,所有的交易請求都要到這里來(lái)處理。
再來(lái)對比一下淘寶和12306的產(chǎn)品區別
淘寶單個(gè)商品的屬性基本上也就是那么幾種,但是12306的車(chē)票就不止了,以北京西到深圳北的G72為例。北京西到深圳北一共有17個(gè)站點(diǎn),3種不同類(lèi)型的座位(商務(wù)、一等、二等)。
那這里有多少種票呢,若從北京西開(kāi)始出發(fā),后面需要經(jīng)過(guò)16個(gè)站點(diǎn),每到一個(gè)站點(diǎn)的票,就相對于是一個(gè)獨立的商品。在第二站上車(chē)的,有15種不同的下車(chē)可能,在第三站上車(chē)的,有14種不同的下車(chē)可能,以此類(lèi)推就有了136種方式,再算上三種不同類(lèi)型的車(chē)票,就有3*136=408種不同類(lèi)型的車(chē)票。
而在處理庫存時(shí),也并沒(méi)有大家想的這么簡(jiǎn)單,如果一個(gè)人從第一站上車(chē),到第二站下車(chē),這樣就需要在第一到第二的商品庫存減一,同時(shí)第一站到后面的每一個(gè)站臺都需要減少一個(gè)庫存,一共需要減少16個(gè)商品的庫存。
再如果這個(gè)人是從第一站到最后一站,則第一站到后面16個(gè)站點(diǎn)都要減一,總計就要減少16+15+14。。。+1=120個(gè)。而這些數據還都是理論上的數值,現實(shí)中還要考慮鐵道部對于不同站點(diǎn)分配的車(chē)票數。
在淘寶上買(mǎi)一個(gè)商品,需要減少對應商品的庫存,但是賣(mài)出一張火車(chē)票,可能就需要對數十個(gè)商品的庫存做修改。
此外12306的歷史包袱我們也不能忽略,它后面還需要考慮票池、電話(huà)售票、火車(chē)站售票、代售點(diǎn)售票等傳統服務(wù)。
說(shuō)了這么多,并不是筆者一味的捧12306平臺,只是不少人確實(shí)對其還存在很多的誤解。作為一個(gè)民用的系統,12306的提升空間還非常的大,PC端的頁(yè)面若采用太多JS或者CSS樣式都會(huì )大大加重服務(wù)器的負擔,但在A(yíng)PP上其實(shí)確實(shí)還可以好好修改一下,畢竟整個(gè)系統的設計風(fēng)格確實(shí)是十年前的審美。
聯(lián)系客服