監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢(xún)管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶(hù)案例 | 在線(xiàn)試用
X 關(guān)閉

IT一家言:12306已近技術(shù)極限

申請(qǐng)免費(fèi)試用、咨詢(xún)電話(huà):400-8352-114

 聲明:本文原作者“代碼狗”,內(nèi)容有刪剪。12306問(wèn)題背后,技術(shù)原因究竟占了幾成?不管你信不信,我是通篇讀完了。

 

        資深程序員現(xiàn)身說(shuō)法

  我曾在淘寶寫(xiě)過(guò)一段時(shí)間代碼,2012年在一家百?gòu)?qiáng)民企做電商副總,當(dāng)時(shí)在極為艱苦的條件下帶隊(duì)開(kāi)發(fā)了一個(gè)B2C網(wǎng)站,走支付寶和銀聯(lián)支付通道,年?duì)I業(yè)額千萬(wàn)級(jí)(當(dāng)然實(shí)在太少了,我只是說(shuō)這個(gè)網(wǎng)站投入了實(shí)際的運(yùn)營(yíng))。

  也就在那個(gè)時(shí)候,我對(duì)“12306”嗤之以鼻,覺(jué)得他們做得太爛了,認(rèn)為自己能帶隊(duì)花幾百萬(wàn)元用半年時(shí)間做個(gè)好的出來(lái)。于是我狂妄地想做一個(gè)開(kāi)源的訂票系統(tǒng)給他們。我花了一個(gè)星期時(shí)間思考建立數(shù)據(jù)模型,思考到庫(kù)存這一步的時(shí)候,我才發(fā)現(xiàn),“12306”的庫(kù)存復(fù)雜性比淘寶、京東高很多倍,運(yùn)算量也大很多倍。傳統(tǒng)的分布式數(shù)據(jù)庫(kù)、緩存、負(fù)載均衡技術(shù)并不能恰好滿(mǎn)足“12306”的需求。

  淘寶技術(shù)的確比“12306”強(qiáng)大很多倍,淘寶現(xiàn)在的系統(tǒng)也是花了10倍于“12306”的錢(qián)、時(shí)間和人力才做起來(lái)的。根本原因還是鐵路運(yùn)力不能滿(mǎn)足春運(yùn)需求,淘寶也解決不了這個(gè)問(wèn)題。

  “12306”這一年來(lái)進(jìn)步非常大。從前端動(dòng)畫(huà)驗(yàn)證碼、分時(shí)段搶票,到后端去小型機(jī)、虛擬化、內(nèi)存數(shù)據(jù)庫(kù)的運(yùn)用??梢哉f(shuō),這是中國(guó)官方部門(mén)做得最強(qiáng)大的網(wǎng)站(電商系統(tǒng))。至于“12306”一期工程3個(gè)億(含硬件)貴不貴我不評(píng)價(jià),我只提供一個(gè)數(shù)字供參考:百度一年的研發(fā)費(fèi)用(不含硬件)是10億元,這來(lái)自百度財(cái)報(bào)。3億元看起來(lái)好大一個(gè)數(shù)字,真用到超大型的電商系統(tǒng)、搜索引擎系統(tǒng)里面,其實(shí)也不算天文數(shù)字了。

  你不知道的“秒殺”

  為什么秒殺壓力大,為什么“12306”的動(dòng)態(tài)庫(kù)存很復(fù)雜?

  先說(shuō)秒殺。

  2013年12月25日前后,天貓搞了一個(gè)圣誕季積分兌換活動(dòng),持續(xù)幾天。25日上午10時(shí)12分,放出了15000個(gè)天貓魔盒,從成交記錄上看,19秒內(nèi)全部搶完。

  實(shí)際上,我也參加秒殺了,那天的題目特別簡(jiǎn)單——請(qǐng)輸入×××漢字的拼音首字母,我5秒內(nèi)答題完畢并提交訂單,結(jié)果系統(tǒng)告訴我排隊(duì)的人太多,擠不進(jìn)去,并提示14秒后重試。人太多就是因?yàn)轭}目太簡(jiǎn)單了,門(mén)檻越低,5秒內(nèi)擠進(jìn)去的人也越多,如果題目換成“2克濃度為3%的U235在大亞灣核電站能發(fā)多少度電”,5分鐘之內(nèi)都不會(huì)有1萬(wàn)5千人跟我競(jìng)爭(zhēng)。

  我想,14秒以后哪還有我的事呀,于是重新答題秒殺,結(jié)果出現(xiàn)了服務(wù)器錯(cuò)誤的頁(yè)面。反復(fù)刷新幾次,秒殺就已經(jīng)結(jié)束了。

  淘寶是什么技術(shù)水平呢,淘寶有至少4000名技術(shù)人員,至少4萬(wàn)臺(tái)服務(wù)器(這是兩年前的公開(kāi)數(shù)據(jù))。2013年11月11日成交額351億元,2012年全年成交額超過(guò)1萬(wàn)億元。

  淘寶擁有各種自主研發(fā)團(tuán)隊(duì):服務(wù)器、交換機(jī);操作系統(tǒng)、Web服務(wù)器、Java語(yǔ)言虛擬機(jī)、數(shù)據(jù)庫(kù)、負(fù)載均衡器、Java運(yùn)行容器。淘寶還有數(shù)不清的開(kāi)源項(xiàng)目和中間件,如高性能Java通信中間件HSF、分布式數(shù)據(jù)庫(kù)中間件TDDL、異步消息系統(tǒng)notify等等。

  以淘寶這樣的技術(shù)水平,都還不能做到秒殺時(shí)讓每個(gè)用戶(hù)都沒(méi)有擁擠感,為什么?

  一是要尊重物理原理,一臺(tái)服務(wù)器一秒鐘能承受的計(jì)算量是有極限的,任你怎么優(yōu)化,采用多高效的算法和編程語(yǔ)言,都突破不了某個(gè)極限,比方說(shuō)汽車(chē)發(fā)動(dòng)機(jī)驅(qū)動(dòng)的F1賽車(chē)至今也不能突破400公里的時(shí)速。

  二是要考慮經(jīng)濟(jì)效益,“十一”黃金周的時(shí)候,北京主城區(qū)到八達(dá)嶺長(zhǎng)城的路堵得嚴(yán)嚴(yán)實(shí)實(shí),但不能因?yàn)辄S金周的高峰,就把這段路修成長(zhǎng)安街那樣10車(chē)道的高速公路,否則花費(fèi)天文數(shù)字(“12306”那3個(gè)億大概只夠修1-3公里)修了一段路,平時(shí)曬谷子?

  淘寶目前的硬件和帶寬數(shù)量,已經(jīng)超出日常運(yùn)營(yíng)的需求了,目的就是留出相當(dāng)大的余量給大促銷(xiāo)。

  再說(shuō)動(dòng)態(tài)庫(kù)存。

  淘寶秒殺天貓魔盒的時(shí)候,只有一個(gè)商品(SKU),它的庫(kù)存是15000個(gè)。有一個(gè)人秒殺到了,庫(kù)存就減1,19秒賣(mài)完的,每秒要成功產(chǎn)生789個(gè)訂單。想象一下,你在廣場(chǎng)上賣(mài)火車(chē)票,一秒鐘內(nèi)有8萬(wàn)人舉著錢(qián)對(duì)你喊:賣(mài)給我!

  很多人都知道,比秒小的時(shí)間單位還有毫秒、皮秒、飛秒。但交易系統(tǒng)登記一個(gè)交易可不像電子繞著原子核跑一圈那么簡(jiǎn)單,它要做這些事:檢查是否惡意訪(fǎng)問(wèn)、取到系統(tǒng)時(shí)間、取到顧客默認(rèn)收貨地址、核對(duì)顧客秒殺資格、生成訂單號(hào)、把顧客ID系統(tǒng)時(shí)間訂單號(hào)收貨地址寫(xiě)入訂單系統(tǒng)、扣除顧客天貓積分、商品庫(kù)存減1、給顧客打標(biāo)記(每人只能秒一個(gè))等等等等,每件事都要花費(fèi)毫秒級(jí)別的時(shí)間,這些操作加起來(lái)的時(shí)間可能是接近1秒級(jí)別的,但由于淘寶的服務(wù)器比較強(qiáng)悍,而且采用了分布式和集群技術(shù),結(jié)果比1秒理想一點(diǎn)。但即使有1萬(wàn)臺(tái)服務(wù)器,也不能把這個(gè)時(shí)間稀釋成萬(wàn)分之一秒,因?yàn)?,商品只有一種,它有15000個(gè)庫(kù)存,對(duì)應(yīng)的數(shù)據(jù)庫(kù)記錄只有一行,所有的交易請(qǐng)求都要到這里來(lái)處理。

  能不能把這15000個(gè)拆分成5000個(gè)商品并分配到5000臺(tái)服務(wù)器上呢?那樣不就可以5000臺(tái)服務(wù)器同時(shí)處理了嗎?答案是不能,首先,5000個(gè)商品,意味著有5000個(gè)商品詳情頁(yè),5000個(gè)購(gòu)買(mǎi)按鈕,這對(duì)前期的營(yíng)銷(xiāo)、引流是個(gè)災(zāi)難。基本上就沒(méi)法做引流入口了,顯然這違背了商業(yè)管理原則,人為增加了信息混亂程度。其次,天貓魔盒秒殺也不是啥大事,即使按官方標(biāo)價(jià)399元來(lái)計(jì)算,也就600萬(wàn)元的交易。如果600萬(wàn)的交易要花費(fèi)那么大的配套成本,就太不劃算了。再次,淘寶有十幾億商品,這十幾億商品的展示交易和管理,本來(lái)就是分布到上萬(wàn)臺(tái)服務(wù)器上去了。沒(méi)有必要再把每個(gè)商品按庫(kù)存拆成多個(gè)商品了。

  這789人搶到了,還不一定會(huì)付款,所以就又帶來(lái)訂單取消重新恢復(fù)庫(kù)存的問(wèn)題。還有想要的消費(fèi)者們,會(huì)認(rèn)為還有機(jī)會(huì),繼續(xù)在前臺(tái)刷一會(huì)兒,最終這個(gè)秒殺會(huì)被熱情的消費(fèi)者們猛刷30秒到1分鐘。

  12306的“變態(tài)”庫(kù)存

  好了,講了半天淘寶,回到正題“12306”——我以北京西到深圳北的G71次高鐵為例,它有17個(gè)站(北京西是01號(hào)站,深圳北是17號(hào)站),3種座位(商務(wù)、一等、二等)。表面看起來(lái),這不就是3個(gè)商品嗎?G71商務(wù)座、G71一等座、G71二等座。大部分吐槽的人就是在這里栽第一個(gè)跟頭的。

  實(shí)際上,G71有136×3=408種商品(408個(gè)SKU),怎么算出來(lái)的?請(qǐng)看:如果賣(mài)北京西始發(fā)的,有16種賣(mài)法(因?yàn)楹竺嬗?6個(gè)站),北京西到:保定、石家莊、鄭州、武漢、長(zhǎng)沙、廣州、虎門(mén)、深圳……分別都是一個(gè)獨(dú)立的商品。

  同理,石家莊上車(chē)的,有15種下車(chē)的可能,以此類(lèi)推,單以上下車(chē)的站來(lái)計(jì)算,有136種票:16+15+14……+2+1=136。每種票都有3種座位,一共是408個(gè)商品。

  再看出票時(shí)怎么減庫(kù)存,由于商務(wù)、一等、二等三種座位數(shù)是獨(dú)立的,庫(kù)存操作也是一樣的,下文我就不再提座位的差別,只討論出發(fā)與到達(dá)站。另外,下文說(shuō)的是理論模型,不是說(shuō)“12306”的數(shù)據(jù)庫(kù)就是這么設(shè)計(jì)的。

  旅客A買(mǎi)了一張北京西(01號(hào)站)到保定東(02號(hào)站)的,那么北京西到保定東這個(gè)商品的庫(kù)存就要減1,同時(shí),北京西到石家莊、鄭州、武漢、長(zhǎng)沙、廣州、虎門(mén)、深圳等15個(gè)站臺(tái)的商品庫(kù)存也要減1,也就是說(shuō),出一張北京西到保定東的票,實(shí)際上要減16個(gè)商品的庫(kù)存。

  這還不是最復(fù)雜的,如果旅客B買(mǎi)了一張北京西(01號(hào)站)到深圳北(17號(hào)站)的票,除了北京西到深圳北這個(gè)商品的庫(kù)存要減1,北京西到保定東、石家莊、鄭州、武漢、長(zhǎng)沙、廣州、虎門(mén)等15個(gè)站臺(tái)的商品庫(kù)存也要減1,保定東到石家莊、鄭州、武漢、長(zhǎng)沙、廣州、虎門(mén)、深圳北等15個(gè)站臺(tái)的商品庫(kù)存要減1……總計(jì)要減庫(kù)存的商品數(shù)是16+15+14+……+1=120個(gè)。

  當(dāng)然,也不是每一張票的庫(kù)存都完全這樣實(shí)時(shí)計(jì)算,可以根據(jù)往年的運(yùn)營(yíng)情況,在高峰時(shí)段預(yù)先對(duì)車(chē)票做一些分配,比如北京到武漢的長(zhǎng)途多一點(diǎn),保定到石家莊的短途少一點(diǎn)。我沒(méi)有證據(jù)證實(shí)鐵道部門(mén)這樣做了,但我相信,在還沒(méi)有“12306”網(wǎng)站的時(shí)候,就有這種人工預(yù)分配的策略了。

  再想象一下,8萬(wàn)人舉著錢(qián)對(duì)你高喊:賣(mài)給我。你好不容易在錢(qián)堆里找到一只手,拿了他的錢(qián),轉(zhuǎn)身找120個(gè)同事,告訴他們減庫(kù)存,而這120個(gè)同事也和你一樣被8萬(wàn)人圍著;也和你一樣,每賣(mài)出一個(gè)商品要找?guī)资畟€(gè)人減庫(kù)存……這就是“12306”動(dòng)態(tài)庫(kù)存的變態(tài)之處。比你平時(shí)買(mǎi)東西的任何網(wǎng)站的庫(kù)存機(jī)制都復(fù)雜幾十上百倍。

  空談技術(shù)無(wú)益解決問(wèn)題

  防軟件搶票,也不是加個(gè)圖片驗(yàn)證碼那么簡(jiǎn)單。圖片驗(yàn)證碼有6種機(jī)器暴力破解的辦法,搶票插件用的是OCR識(shí)別。驗(yàn)證碼設(shè)置得復(fù)雜一點(diǎn)行不行?有人又要提意見(jiàn)了:這只是便宜了大學(xué)生和辦公室白領(lǐng),農(nóng)民工連26個(gè)字母都認(rèn)不齊,怎么搞?搞動(dòng)畫(huà)驗(yàn)證碼吧,也有人說(shuō),視力不好的人怎么辦?最后驗(yàn)證碼被搞得很簡(jiǎn)單,皆大歡喜。其實(shí)最高興的是開(kāi)發(fā)搶票插件的公司。

  就算采用了機(jī)器完全不可能識(shí)別的驗(yàn)證碼,也防不住社會(huì)工程學(xué)的破解辦法。招募一堆網(wǎng)吧打游戲的青少年朋友,每成功輸入50個(gè)驗(yàn)證碼給1塊錢(qián),或者等值的虛擬貨幣、游戲裝備,我保證想賺這個(gè)錢(qián)的人數(shù)不勝數(shù)。這點(diǎn)錢(qián)對(duì)轉(zhuǎn)賣(mài)車(chē)票的利潤(rùn)而言,是可以接受的成本。有沒(méi)有什么技術(shù)可以防住社會(huì)工程學(xué)的破解辦法呢?能防住網(wǎng)吧青少年的驗(yàn)證碼只有——“2克濃度為3%的U235在大亞灣核電站能發(fā)多少度電”。

  以上討論只是把“12306”當(dāng)成和淘寶一樣沒(méi)有歷史包袱從零起步的交易系統(tǒng),實(shí)際上它不是,它后面的票池還有電話(huà)售票、火車(chē)站售票、代售點(diǎn)售票等多個(gè)傳統(tǒng)渠道要服務(wù)。除了客運(yùn)服務(wù),“12306”還有全國(guó)最大(很可能也是全球最大)的大宗物資貨運(yùn)系統(tǒng)。架空政策(包括定價(jià)政策、警方打擊“黃牛”政策、身份驗(yàn)證政策)談技術(shù),是不可能解決春運(yùn)搶票困局的。

  還有人說(shuō),KFC的食品可以單賣(mài),也可以賣(mài)套餐,為什么沒(méi)像我一樣搞出這么多SKU?那是因?yàn)?,KFC門(mén)店的“人肉查詢(xún)”頻率非常低,沒(méi)必要為了優(yōu)化查詢(xún)性能把庫(kù)存結(jié)構(gòu)設(shè)計(jì)成那樣。

發(fā)布:2007-03-30 17:10    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章: