在互聯(lián)網(wǎng)從業(yè)者看來(lái),12306購(gòu)票網(wǎng)站問(wèn)題的根源在于鐵道部自成一體的積習(xí)與互聯(lián)網(wǎng)開(kāi)放透明的時(shí)代潮流之間的不兼容。盡管與“鐵老大”之間難有對(duì)接溝通渠道,“程序員”們還是自發(fā)成立了旨在優(yōu)化和開(kāi)發(fā)12306的開(kāi)源項(xiàng)目。我們從項(xiàng)目中邀請(qǐng)數(shù)位專(zhuān)業(yè)人士,測(cè)評(píng)12306網(wǎng)站,并對(duì)“鐵老大”的互聯(lián)網(wǎng)表現(xiàn)做出分析和建議。
像修鐵路一樣建網(wǎng)站
洪水般兇猛的春運(yùn)勢(shì)能推動(dòng)下,作為“鐵路官方唯一購(gòu)買(mǎi)火車(chē)票的網(wǎng)站”,12306確實(shí)承受了相當(dāng)大的壓力——數(shù)據(jù)機(jī)構(gòu)Hitwise披露,2013年1月19日,12306頁(yè)面瀏覽量(PV)達(dá)到1.2億,平均每個(gè)用戶瀏覽14個(gè)頁(yè)面,這意味著12306當(dāng)日獨(dú)立訪客(UV)接近千萬(wàn),這樣的數(shù)據(jù)已經(jīng)超過(guò)京東、去哪兒等網(wǎng)站。
在2012年的春運(yùn)期間,全國(guó)數(shù)千萬(wàn)用戶遇到了服務(wù)器宕機(jī)、支付故障、排隊(duì)時(shí)間冗長(zhǎng)等一系列問(wèn)題。有70%用戶反映無(wú)法在30分鐘內(nèi)正常登錄網(wǎng)站,剩余的30%人中分別在查詢-選定-下單-支付這四步過(guò)程中隨機(jī)遇到服務(wù)器拒絕訪問(wèn)、網(wǎng)站停止響應(yīng)、當(dāng)前用戶數(shù)過(guò)多的情況。
“問(wèn)題的實(shí)質(zhì)是傳統(tǒng)思維的鐵老大在進(jìn)入互聯(lián)網(wǎng)的過(guò)程中準(zhǔn)備不足。”某知名電商公司技術(shù)副總裁何然認(rèn)為,12306遇到的首先是服務(wù)模式的挑戰(zhàn):互聯(lián)網(wǎng)產(chǎn)品需要“小步快跑”式的微創(chuàng)新,首先快速推出業(yè)務(wù)占領(lǐng)市場(chǎng)空白,然后在最短時(shí)間內(nèi)進(jìn)行技術(shù)迭代,在此期間內(nèi)以良好服務(wù)提升用戶體驗(yàn),降低流失,這是一個(gè)正常互聯(lián)網(wǎng)公司所應(yīng)遵循的發(fā)展軌跡。
而12306的建設(shè)與修建一條鐵路的傳統(tǒng)模式?jīng)]有什么分別:承包方簽訂服務(wù)協(xié)議,完工后不再負(fù)責(zé)運(yùn)營(yíng)、維護(hù)及后續(xù)開(kāi)發(fā)。這種模式本身就存在隱患,再加上春運(yùn)期間的流量和訪問(wèn)數(shù)遠(yuǎn)遠(yuǎn)超過(guò)想象,直接導(dǎo)致服務(wù)器故障。何然做了一個(gè)對(duì)比,“12306訪問(wèn)峰值數(shù)據(jù)相當(dāng)于淘寶的‘雙十一’活動(dòng)期間數(shù)據(jù)量。為了實(shí)現(xiàn)穩(wěn)定的數(shù)據(jù)庫(kù)結(jié)構(gòu),淘寶用了將近八年,而12306卻只有短短幾個(gè)月。”
缺乏中間層的設(shè)計(jì)硬傷
“程序開(kāi)發(fā)中有一個(gè)堤壩理論:修建堤壩為了抵御大浪,一般會(huì)做幾層,一層比一層高,這樣可以分批次抵擋波浪。網(wǎng)站流量也是如此,層級(jí)越多,分流后壓力就越小,網(wǎng)站也就越安全。12306在設(shè)計(jì)上,缺少中間層的緩沖,前端用戶需求直接涌入最后端的數(shù)據(jù)庫(kù),造成了一系列的故障。”
何然進(jìn)一步解釋?zhuān)绻凑沾笮蜕虡I(yè)網(wǎng)站的思路來(lái)設(shè)計(jì)12306,最底層的是車(chē)票池(集中式數(shù)據(jù)庫(kù)),對(duì)接傳統(tǒng)鐵路系統(tǒng)票務(wù)TRS(鐵路客票系統(tǒng))和TBS(高鐵售票系統(tǒng)),“這部分是傳統(tǒng)業(yè)務(wù),有多年的積淀,做得不錯(cuò)”。
第二層是分布式數(shù)據(jù)庫(kù)。從集中式數(shù)據(jù)庫(kù)到分布式數(shù)據(jù)庫(kù),其實(shí)就是從一個(gè)大車(chē)票池分流到很多小車(chē)票池。比如華北地區(qū)一個(gè)池,珠三角一個(gè)池,把不同的需求分散出去。
第三層是交易網(wǎng)關(guān),主要是處理訂單信息及支付環(huán)節(jié)。并發(fā)式是這一層的主要特點(diǎn),同時(shí)會(huì)有百萬(wàn)級(jí)別的用戶進(jìn)行在線交易。
第四層是安全層,起到防火墻的作用,用于過(guò)濾和清除黃牛刷票等惡意流量,及網(wǎng)絡(luò)攻擊防護(hù),保障普通用戶的正常訪問(wèn)。最上層是服務(wù)網(wǎng)關(guān),基于這一層,可以搭建購(gòu)票網(wǎng)站(12306)、安卓客戶端、iOS客戶端等,這一層也是直接對(duì)接用戶的。
第二層到第四層在開(kāi)發(fā)中一般叫作引擎,而如果引擎的部分設(shè)計(jì)失誤或?qū)崿F(xiàn)不完全,直接表現(xiàn)就是前端服務(wù)不穩(wěn)定,容易發(fā)生出票故障、支付錯(cuò)誤等問(wèn)題。
“看起來(lái)之前12306的架構(gòu)就是在第五層服務(wù)網(wǎng)關(guān)接受了用戶購(gòu)票的請(qǐng)求后,直接推到底層的數(shù)據(jù)庫(kù)環(huán)節(jié),缺少中間層引擎部分的緩沖和分流,這就使得集中式數(shù)據(jù)庫(kù)在瞬時(shí)大流量請(qǐng)求面前崩潰了。”
原始的前端水平
在架構(gòu)之外,12306還存在一系列問(wèn)題,包括至今仍未更改的簡(jiǎn)陋界面。眾多網(wǎng)站的前端工程師在分析后均表示,這樣的前端水平實(shí)在過(guò)于原始,技術(shù)還停留在三四年前。
一系列12306的漏洞接二連三地被發(fā)現(xiàn)。比如有“技術(shù)宅”通過(guò)修改12306提交頁(yè)面的代碼,成功定到臥鋪下鋪(正常出票為隨機(jī)鋪位);還有人寫(xiě)出了提前20天以上購(gòu)票的腳本;最終則出現(xiàn)了“購(gòu)票助手”、“瀏覽器購(gòu)票插件”這類(lèi)工具。
“打開(kāi)主頁(yè)要建60多個(gè)HTTP連接,現(xiàn)在的瀏覽器都是并發(fā)請(qǐng)求的,100萬(wàn)用戶就是6000多萬(wàn)個(gè)請(qǐng)求,太多了;首頁(yè)圖片共計(jì)700k左右,如果100萬(wàn)用戶首次同時(shí)訪問(wèn),并在120秒之內(nèi)返回,就要下載47Gbps的數(shù)據(jù)。如果網(wǎng)站能減肥,節(jié)約帶寬后訪問(wèn)速度會(huì)大幅提升。”程序員“銀魂最高”建議。
軟件工程師趙會(huì)軍認(rèn)為:“即使這個(gè)并發(fā)量做到足夠大,結(jié)果只能是所有票瞬間賣(mài)完,然后系統(tǒng)全天剩余時(shí)間無(wú)所事事。所以,首先要解決的是把購(gòu)票時(shí)間規(guī)則改變,進(jìn)行分散,然后才輪到解決并發(fā)量的問(wèn)題。”
丁香園CTO馮大輝則建議使用通用的數(shù)字證書(shū)。“12306的數(shù)字證書(shū)是自己簽發(fā)的而非通用的,需要瀏覽器和其他應(yīng)用來(lái)兼容,在某些瀏覽器上甚至根本無(wú)法使用,這顯然影響用戶體驗(yàn)。”
這些建議部分已經(jīng)被實(shí)現(xiàn)。比如今年的放票規(guī)則就已經(jīng)修改為8至18時(shí),除14時(shí)外每小時(shí)均有部分新票發(fā)售。自2013年1月7日開(kāi)始(提前20天)發(fā)售春運(yùn)客票至今,整個(gè)12306只有兩次時(shí)間不長(zhǎng)的技術(shù)故障。結(jié)合數(shù)據(jù)庫(kù)的一系列改進(jìn),2013年絕大多數(shù)人的反饋不再是“登不上”,而是“買(mǎi)不到票”。
有限的網(wǎng)絡(luò)票源
買(mǎi)不到票當(dāng)然并不只是因?yàn)榭推庇邢薜脑?。在這個(gè)顯而易見(jiàn)的問(wèn)題背后,隱藏著的是新老系統(tǒng)的對(duì)接問(wèn)題。
12306并非一套獨(dú)立的購(gòu)票系統(tǒng)。鐵道部原先用的是一套人工售票系統(tǒng),12306是建立在這個(gè)系統(tǒng)之上的互聯(lián)網(wǎng)通用自助購(gòu)票平臺(tái),兩者共享同一個(gè)票池。這就引出一個(gè)最現(xiàn)實(shí)的問(wèn)題,一列火車(chē)的所有客票,究竟有多少應(yīng)該通過(guò)互聯(lián)網(wǎng)發(fā)售?
比如今年春運(yùn)在“購(gòu)票助手”出現(xiàn)后在互聯(lián)網(wǎng)上曾引發(fā)熱議:既然網(wǎng)絡(luò)客票提前20天發(fā)售而售票窗只提前18天,擁有“購(gòu)票助手”對(duì)排隊(duì)買(mǎi)票的農(nóng)民工是否公平?
通過(guò)了解整套購(gòu)票系統(tǒng),答案已經(jīng)很明顯。但我們有理由相信在去年的春運(yùn)時(shí)期,鐵道部由于首次設(shè)計(jì)客票方案,在兩者的比例上缺乏經(jīng)驗(yàn),導(dǎo)致12306可買(mǎi)的票數(shù)實(shí)際上并沒(méi)有想象的那么多。
“從今年整體情況來(lái)看,12306及電話訂票的總出票數(shù)占到客票總量的30%至40%。這個(gè)比例比去年高一些,但我們不能因此認(rèn)為這已經(jīng)是最優(yōu)方案。網(wǎng)絡(luò)渠道出票比例多大最合適,還要慢慢摸索”,一位鐵路系統(tǒng)的內(nèi)部人士表示。
可以想見(jiàn)在今后很長(zhǎng)一段時(shí)間內(nèi),這種網(wǎng)絡(luò)+人工售票雙軌并行的銷(xiāo)售方式不會(huì)改變,而這也就注定了無(wú)論你是使用360瀏覽器、購(gòu)票助手軟件或是每天堅(jiān)持自行點(diǎn)擊鼠標(biāo),你爭(zhēng)取的都只是本就為數(shù)不多的車(chē)票中比較小的那一部分。
至少在互聯(lián)網(wǎng)上做到開(kāi)放和透明
雖然并不明白個(gè)中原理,但得知整個(gè)12306項(xiàng)目的中標(biāo)金額合計(jì)在3億人民幣以上時(shí),公眾還是發(fā)出了憤怒的聲音:3億就換來(lái)這么個(gè)玩意?
曾負(fù)責(zé)過(guò)大型資訊門(mén)戶和電商網(wǎng)站技術(shù)架構(gòu)的何然坦言:“12306技術(shù)上的難度很大。3億的數(shù)字肯定含有水分,但差距并不像一般人所想象的那么大。”
例如把12306與淘寶對(duì)比:雖然“雙十一”活動(dòng)期間淘寶總交易數(shù)1.06億筆,但淘寶商品實(shí)際上是靜態(tài)的,只需要做購(gòu)買(mǎi)隊(duì)列,當(dāng)排隊(duì)者超過(guò)商品數(shù)時(shí)即關(guān)閉購(gòu)買(mǎi),其間并不需要查詢數(shù)據(jù)庫(kù)。而12306的所有查詢都必須實(shí)時(shí),尤其是同一條線路上當(dāng)起點(diǎn)站的票狀態(tài)被確定時(shí),沿途各站的車(chē)票狀態(tài)都會(huì)隨之變化,因此即使試圖做分布式數(shù)據(jù),整條線路上所有支站狀態(tài)表加在一起也是一個(gè)相當(dāng)大的數(shù)字。
“通過(guò)測(cè)算可以看出來(lái),去年可用性太差了,今年技術(shù)和業(yè)務(wù)都有優(yōu)化。”丁香園CTO馮大輝透露,2012年5月鐵道部邀請(qǐng)阿里巴巴等多家互聯(lián)網(wǎng)公司技術(shù)骨干,作為顧問(wèn)向12306項(xiàng)目提建議,其中部分已被采納。
盡管能得到專(zhuān)業(yè)人士的理解,也有不小進(jìn)步,但12306仍然被千夫所指??梢哉f(shuō),鐵道部建設(shè)網(wǎng)站的傳統(tǒng)方式即埋下隱患;在應(yīng)對(duì)業(yè)界討論和公眾輿論方面仍然缺乏開(kāi)放的姿態(tài),則放大了問(wèn)題。
例如2012年9月,何然看到很多程序員無(wú)法在12306訂購(gòu)火車(chē)票,即牽頭成立了12306ng.org社區(qū)。該項(xiàng)目所有開(kāi)發(fā)過(guò)程、開(kāi)放文檔、源代碼都是開(kāi)放的,所有互聯(lián)網(wǎng)公司都可免費(fèi)調(diào)用(包括12306)。何然的想法是,12306開(kāi)源項(xiàng)目能夠部分替代12306在線訂票或分發(fā)、處理數(shù)據(jù),并且能與12306無(wú)縫切換。目前這一社區(qū)已經(jīng)聚集了1萬(wàn)多名開(kāi)發(fā)者,也做出了一些相關(guān)的產(chǎn)品如瀏覽器搶票插件、手機(jī)客戶端等。
但何然表示前景并不樂(lè)觀:“離想象中還很遠(yuǎn),和鐵道部的溝通基本沒(méi)有;他們也沒(méi)有開(kāi)放接口,我們走得很艱難。”
2012年,曾有網(wǎng)友提出鐵道部應(yīng)當(dāng)對(duì)12306進(jìn)行公開(kāi)招標(biāo),亦有人戲言應(yīng)當(dāng)讓淘寶接管這部分業(yè)務(wù)。而以鐵道部自成一體的特殊狀況來(lái)看,這些提議都缺乏可行性。但鐵道部若希望減少批評(píng),降低輿論壓力,則應(yīng)當(dāng)公布網(wǎng)站建設(shè)資金去向,并在維護(hù)和后續(xù)開(kāi)發(fā)上呈現(xiàn)互聯(lián)網(wǎng)時(shí)代所應(yīng)有的開(kāi)放姿態(tài)。至少在以開(kāi)放和透明為時(shí)代潮流的互聯(lián)網(wǎng)上,“鐵老大”的前現(xiàn)代思維應(yīng)該改一改了。 |