天天看點

12306網站已接近技術極限

網友吐槽12306網站 專家:已接近技術極限

2014-01-20

我曾在淘寶寫過一段時間代碼,2012年在一家百強民企做電商副總,當時在極為艱苦的條件下帶隊開發了一個B2C網站,走支付寶和銀聯支付通道,年營業額千萬級(當然實在太少了,我隻是說這個網站投入了實際的營運)。

也就在那個時候,我對“12306”嗤之以鼻,覺得他們做得太爛了,認為自己能帶隊花幾百萬元用半年時間做個好的出來。于是我狂妄地想做一個開源的訂票系統給他們。我花了一個星期時間思考建立資料模型,思考到庫存這一步的時候,我才發現,“12306”的庫存複雜性比淘寶、京東高很多倍,運算量也大很多倍。傳統的分布式資料庫、緩存、負載均衡技術并不能恰好滿足“12306”的需求。

淘寶技術的确比“12306”強大很多倍,淘寶現在的系統也是花了10倍于“12306”的錢、時間和人力才做起來的。根本原因還是鐵路運力不能滿足春運需求,淘寶也解決不了這個問題。

“12306”這一年來進步非常大。從前端動畫驗證碼、分時段搶票,到後端去小型機、虛拟化、記憶體資料庫的運用。可以說,這是中國官方部門做得最強大的網站(電商系統)。至于“12306”一期工程3個億(含硬體)貴不貴我不評價,我隻提供一個數字供參考:百度一年的研發費用(不含硬體)是10億元,這來自百度财報。3億元看起來好大一個數字,真用到超大型的電商系統、搜尋引擎系統裡面,其實也不算天文數字了。

你不知道的“秒殺”

為什麼秒殺壓力大,為什麼“12306”的動态庫存很複雜?

先說秒殺。

2013年12月25日前後,天貓搞了一個聖誕季積分兌換活動,持續幾天。25日上午10時12分,放出了15000個天貓魔盒,從成交記錄上看,19秒内全部搶完。

實際上,我也參加秒殺了,那天的題目特别簡單——請輸入×××漢字的拼音首字母,我5秒内答題完畢并送出訂單,結果系統告訴我排隊的人太多,擠不進去,并提示14秒後重試。人太多就是因為題目太簡單了,門檻越低,5秒内擠進去的人也越多,如果題目換成“2克濃度為3%的U235在大亞灣核電站能發多少度電”,5分鐘之内都不會有1萬5千人跟我競争。

我想,14秒以後哪還有我的事呀,于是重新答題秒殺,結果出現了伺服器錯誤的頁面。反複重新整理幾次,秒殺就已經結束了。

淘寶是什麼技術水準呢,淘寶有至少4000名技術人員,至少4萬台伺服器(這是兩年前的公開資料)。2013年11月11日成交額351億元,2012年全年成交額超過1萬億元。

淘寶擁有各種自主研發團隊:伺服器、交換機;作業系統、Web伺服器、Java語言虛拟機、資料庫、負載均衡器、Java運作容器。淘寶還有數不清的開源項目和中間件,如高性能Java通信中間件HSF、分布式資料庫中間件TDDL、異步消息系統notify等等。

以淘寶這樣的技術水準,都還不能做到秒殺時讓每個使用者都沒有擁擠感,為什麼?

一是要尊重實體原理,一台伺服器一秒鐘能承受的計算量是有極限的,任你怎麼優化,采用多高效的算法和程式設計語言,都突破不了某個極限,比方說汽車發動機驅動的F1賽車至今也不能突破400公裡的時速。

二是要考慮經濟效益,“十一”黃金周的時候,北京主城區到八達嶺長城的路堵得嚴嚴實實,但不能因為黃金周的高峰,就把這段路修成長安街那樣10車道的高速公路,否則花費天文數字(“12306”那3個億大概隻夠修1-3公裡)修了一段路,平時曬谷子?

淘寶目前的硬體和帶寬數量,已經超出日常營運的需求了,目的就是留出相當大的餘量給大促銷。

再說動态庫存。

淘寶秒殺天貓魔盒的時候,隻有一個商品(SKU),它的庫存是15000個。有一個人秒殺到了,庫存就減1,19秒賣完的,每秒要成功産生789個訂單。想象一下,你在廣場上賣火車票,一秒鐘内有8萬人舉着錢對你喊:賣給我!

很多人都知道,比秒小的時間機關還有毫秒、皮秒、飛秒。但交易系統登記一個交易可不像電子繞着原子核跑一圈那麼簡單,它要做這些事:檢查是否惡意通路、取到系統時間、取到顧客預設收貨位址、核對顧客秒殺資格、生成訂單号、把顧客ID系統時間訂單号收貨位址寫入訂單系統、扣除顧客天貓積分、商品庫存減1、給顧客打标記(每人隻能秒一個)等等,每件事都要花費毫秒級别的時間,這些操作加起來的時間可能是接近1秒級别的,但由于淘寶的伺服器比較強悍,而且采用了分布式和叢集技術,結果比1秒理想一點。但即使有1萬台伺服器,也不能把這個時間稀釋成萬分之一秒,因為,商品隻有一種,它有15000個庫存,對應的資料庫記錄隻有一行,所有的交易請求都要到這裡來處理。

能不能把這15000個拆分成5000個商品并配置設定到5000台伺服器上呢?那樣不就可以5000台伺服器同時處理了嗎?答案是不能,首先,5000個商品,意味着有5000個商品詳情頁,5000個購買按鈕,這對前期的營銷、引流是個災難。基本上就沒法做引流入口了,顯然這違背了商業管理原則,人為增加了資訊混亂程度。其次,天貓魔盒秒殺也不是啥大事,即使按官方标價399元來計算,也就600萬元的交易。如果600萬的交易要花費那麼大的配套成本,就太不劃算了。再次,淘寶有十幾億商品,這十幾億商品的展示交易和管理,本來就是分布到上萬台伺服器上去了。沒有必要再把每個商品按庫存拆成多個商品了。

這789人搶到了,還不一定會付款,是以就又帶來訂單取消重新恢複庫存的問題。還有想要的消費者們,會認為還有機會,繼續在前台刷一會兒,最終這個秒殺會被熱情的消費者們猛刷30秒到1分鐘。

12306的“變态”庫存

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

實際上,G71有136×3=408種商品(408個SKU),怎麼算出來的?請看:如果賣北京西始發的,有16種賣法(因為後面有16個站),北京西到:保定、石家莊、鄭州、武漢、長沙、廣州、虎門、深圳……分别都是一個獨立的商品。

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

再看出票時怎麼減庫存,由于商務、一等、二等三種座位數是獨立的,庫存操作也是一樣的,下文我就不再提座位的差别,隻讨論出發與到達站。另外,下文說的是理論模型,不是說“12306”的資料庫就是這麼設計的。

旅客A買了一張北京西(01号站)到保定東(02号站)的,那麼北京西到保定東這個商品的庫存就要減1,同時,北京西到石家莊、鄭州、武漢、長沙、廣州、虎門、深圳等15個站台的商品庫存也要減1,也就是說,出一張北京西到保定東的票,實際上要減16個商品的庫存。

這還不是最複雜的,如果旅客B買了一張北京西(01号站)到深圳北(17号站)的票,除了北京西到深圳北這個商品的庫存要減1,北京西到保定東、石家莊、鄭州、武漢、長沙、廣州、虎門等15個站台的商品庫存也要減1,保定東到石家莊、鄭州、武漢、長沙、廣州、虎門、深圳北等15個站台的商品庫存要減1……總計要減庫存的商品數是16+15+14+……+1=120個。

當然,也不是每一張票的庫存都完全這樣實時計算,可以根據往年的營運情況,在高峰時段預先對車票做一些配置設定,比如北京到武漢的長途多一點,保定到石家莊的短途少一點。我沒有證據證明鐵道部門這樣做了,但我相信,在還沒有“12306”網站的時候,就有這種人工預配置設定的政策了。

再想象一下,8萬人舉着錢對你高喊:賣給我。你好不容易在錢堆裡找到一隻手,拿了他的錢,轉身找120個同僚,告訴他們減庫存,而這120個同僚也和你一樣被8萬人圍着;也和你一樣,每賣出一個商品要找幾十個人減庫存……這就是“12306”動态庫存的變态之處。比你平時買東西的任何網站的庫存機制都複雜幾十上百倍。

空談技術無益解決問題

防軟體搶票,也不是加個圖檔驗證碼那麼簡單。圖檔驗證碼有6種機器暴力破解的辦法,搶票插件用的是OCR識别。驗證碼設定得複雜一點行不行?有人又要提意見了:這隻是便宜了大學生和辦公室白領,農民工連26個字母都認不齊,怎麼搞?搞動畫驗證碼吧,也有人說,視力不好的人怎麼辦?最後驗證碼被搞得很簡單,皆大歡喜。其實最高興的是開發搶票插件的公司。

就算采用了機器完全不可能識别的驗證碼,也防不住社會工程學的破解辦法。招募一堆網吧打遊戲的青少年朋友,每成功輸入50個驗證碼給1塊錢,或者等值的虛拟貨币、遊戲裝備,我保證想賺這個錢的人數不勝數。這點錢對轉賣車票的利潤而言,是可以接受的成本。有沒有什麼技術可以防住社會工程學的破解辦法呢?能防住網吧青少年的驗證碼隻有——“2克濃度為3%的U235在大亞灣核電站能發多少度電”。

以上讨論隻是把“12306”當成和淘寶一樣沒有曆史包袱從零起步的交易系統,實際上它不是,它後面的票池還有電話售票、火車站售票、代售點售票等多個傳統管道要服務。除了客運服務,“12306”還有全國最大(很可能也是全球最大)的大宗物資貨運系統。架空政策(包括定價政策、警方打擊“黃牛”政策、身份驗證政策)談技術,是不可能解決春運搶票困局的。

還有人說,KFC的食品可以單賣,也可以賣套餐,為什麼沒像我一樣搞出這麼多SKU?那是因為,KFC門店的“人肉查詢”頻率非常低,沒必要為了優化查詢性能把庫存結構設計成那樣。(原作者為“代碼狗”,本文有删節,标題為編者所加)

專家普遍認為“代碼狗”所言在理:“12306”已接近技術極限

填補春運運能尚無有效“神器”

羊城晚報 記者 魯钇山

2014年春運大幕已經開啟,網絡和電話購買火車票平台“12306”再次成為社會關注焦點。

自從“12306”誕生之日起,急着回家過年的人們已不再需要卷着鋪蓋、帶着幹糧去火車站排隊買車票,電話線和網線承載了絕大部分希望。然而,“12306”并不像人們所期待的那樣給力,漏洞多多、時常癱瘓,炒票的“黃牛”轉戰網絡仍然活躍……近日,一位自稱“前淘寶技術人員,且曾在某民營公司做過電商副總”的名為“代碼狗”的網友在網上發帖,詳細分析“12306”網站的技術特點和它所面臨的“不可能完成的任務”,直言這個官方網站已經窮盡所能試圖解決購票難題,但無法單純依靠技術手段徹底填平鐵路運能與春運需求之間的鴻溝。

這引起了人們對“12306”的新一輪審視。“代碼狗”所言有無道理?“12306”平台從技術角度看到底處于怎樣的水準?羊城晚報記者就此采訪了多位專家、電商技術人員以及鐵路部門從業人員。

現實情況可能更複雜

“這篇文章所有的分析都是站在普通讀者能接受的、常識的基礎上展開的,在邏輯上沒有什麼問題,在對系統的分析上也基本成立。‘12306’崩潰的情況現在已經不多見了,在通路量如此之大的情況下這确實是非常難得的。比如前不久有一個比較出名的電商網站因為通路量太大崩潰了,而它的通路量和‘12306’其實是沒辦法比的。”廣州某金融公司電商技術負責人李松在接受羊城晚報記者采訪時表示。

李松認為,“12306”在售票過程中所要處理的“秒殺”式營銷确實在技術上難度很大。“稍微有一個細節處理不好,就容易出現進不了頁面、不能點選購買、購買成功卻付不了費、付了費沒回報等情況,一般的電商網站都會遇到這樣的問題,作為‘龐然大物’的‘12306’當然更難幸免,我們不能過分苛求。解決好這些問題需要時間和資金、技術的投入,必須經過調整、磨合,不是短時間内能辦成的。”

對于“代碼狗”的分析,大多數受訪的業内人士都認為其角度、邏輯比較客觀。

資深電腦工程師王謝認為,“代碼狗”為了行文友善,實際上簡化了“12306”的購票模型,真正的“12306”系統比他說的要複雜很多。“(他)沒有考慮每張車票的座位屬性,這是很關鍵的,否則旅客好不容易擠上車,就要開始搶座了。事實上,應該考慮這樣一個方案:以文中列舉的G71次列車來看,假設該車次總共有M個座位,共16個站段,那就是16×M個商品,而不是簡單的408個。”

技術手段并非萬能藥

“‘代碼狗’的分析有些道理,但是有些問題鐵路部門也有不可推卸的責任。比如最近‘四喜丸子’實名登車、‘路過打醬油’也能買到車票等等。此前很長時間鐵路的購票系統對購票者身份證号碼沒有任何驗證措施,随便輸入一個虛假身份證号也能買票,‘實名制來得太晚’。”——北京某網絡公司資深系統技術專家陳亞飛告訴羊城晚報記者,“對于‘12306’網站的問題,隻有公開方案設計,或者最起碼在較大的專業人士層面公開自己的方案設計,争取更多大腦的參與,才可能發掘出更好的方案。而這正是‘12306’所缺乏的。”

有些技術專家将“黃牛”炒票行為屢禁不止的責任也歸咎于鐵路部門。

“對于普通的購票旅客來說,當初到火車站排隊買票,常被‘黃牛’插隊,輪到旅客時票已經賣完了。現在在‘12306’買票,又被‘黃牛’用搶票軟體插隊,一開賣才幾十秒,稍微輸錯個驗證碼再進去,票又沒了。那麼多‘黃牛’用軟體搶票,售票系統卻沒有對此做出有效應對,應該在技術上對外挂應用程式進行更細緻的甄别和防範。”廣州電腦工程師車宙表示。

知名網際網路專家信海光也認為,現在“12306”的基本政策是“水來土掩”,對網絡“黃牛”的活動都是采取事後措施補救,“應當加強技術建設,填補漏洞,提前做好各種應急預案”。

對于這個問題,中國鐵路總公司副總經理胡亞東在接受記者采訪時表示:“今年鐵路總公司更新了‘12306’網站版本,采取了一些封堵應對措施,鐵路公安部門‘獵鷹戰役’也破獲了一批案件。下一步,還要和國家身份認證權威部門進行網際網路的身份認證聯網,近日正在調試,很快就可以上線運作,可以在更大程度上防範‘黃牛’。”