為什麼鐵路12306的APP經常卡住?
今年貌似是有史以來過年的火車票最難搶的一年,除了人多的因素外,App的難用程度也是一個重要原因。具體包括:
1. 界面響應卡頓,延遲嚴重,每點一個按鈕,包括返回的按鈕,都能感覺到明顯的延遲。
2. 搜索出車次列表後,每次上下滑動直接就變成了點擊,然後就跳到了預訂頁面。。。莫非在界面設計上做些改動或者事件處理上面做些優化真的很困難?
3. 打開一趟車的停靠站點列表,上下滑動就會提示你「是否要把起點站設置為xx站」。。。
相對於解決海量用戶高並發的問題,優化下界面應該還是容易不少的吧,這麼大個公司,花這麼多人力物力,連基本的用戶體驗都做不好,真心想不通。
對於12306的吐槽兩種都有,比如對那驗證碼的吐槽就挺逗樂的,至於不太友好的吐槽可能是大家的不理解造成的。要完整的理解12306,我們需從技術,產品,項目這三個角度去分析。
01、技術角度
「根據來自官方的數據,12306網站PV(頁面瀏覽量)目前每天都超過400億次……」400億次!假設我現在還在做技術,接到了這麼個任務該怎麼處理?優化資料庫訪問、分散式、緩存、負載均衡等一系列名詞在我腦海里跑完後,估計我還是會無辜的抬起頭,淚眼婆娑:老大,要不…我們還是加伺服器吧……400億,這tm老變態了!
關於12306技術分析的問題,網上有很多文章,從12306變態的庫存,變態的訪問量(你見過其他讓你刷他自己的網站的么?),變態的業務(席位復用,限售區段,席位共用……)分析得很透徹了,我從其它兩個我體會最深的方面再說說。
根據新華網記者在中國鐵道科學研究院全路客票系統監控中心看到,12306的技術支持部門正在幾百平方米的大廳集中辦公。大廳內人頭攢動,工程師們不斷就各種技術問題商議、解決。大屏幕上實時顯示著12306網站大數據分析的動態情況:一次訂票交易平均響應時間500毫秒、網站PV值每天超400億次…… 可能單單只是說400億次,大家只能感覺到震撼,當你知道淘寶網的pv值每天平均量在17億-21億之間,儘管雙十一期間達到了21億次,百度的PV值每天平均量7億左右的時候,可能你就會對12306鐵路客戶服務中心產生了敬畏感。12306鐵路客戶服務中心為什麼每年都在升級,但是每年依然是各種媒體的噴點。但是現在我來說說12306鐵路客服中心的牛逼點在哪裡。以下文章轉載一位ID名為「代碼狗」的前淘寶工程師對12306的看法交易系統登記一個交易它要做這些事:檢查是否惡意訪問、取到系統時間、取到顧客默認收貨地址、核對顧客秒殺資格、生成訂單號、把顧客ID系統時間訂單號收貨地址寫入訂單系統、商品庫存減一、給顧客打標記等等,這每一件事都要花費毫秒級別的時間。以北京西到深圳北的G71次高鐵為例(這裡只考慮南下的方向,不考慮深圳北到北京西的,那是另外一個車次,叫G72),它有17個站(北京西是01號站,深圳北是17號站),3種座位(商務、一等、二等)。表面看起來,這不就是3個商品嗎?G71商務座、G71一等座、G71二等座。大部分輕易噴12306的技術人員(包括某些中等規模公司的專家、CTO)就是在這裡栽第一個跟頭的。實際上,G71有136*3=408種商品(408個SKU),怎麼算來的?請看:如果賣北京西始發的,有16種賣法(因為後面有16個站),北京西到:保定、石家莊、鄭州、武漢、長沙、廣州、虎門、深圳。。。。都是一個獨立的商品,同理,石家莊上車的,有15種下車的可能,以此類推,單以上下車的站來計算,有136種票:16+15+14....+2+1=136。每種票都有3種座位,一共是408個商品。好了,再看出票時怎麼減庫存,由於商務、一等、二等三種座位數是獨立的,庫存操作也是一樣的,下文我就不再提座位的差別的,只討論出發與到達站。另外,下文說的是理論世界的模型,不是說12306的資料庫就是這麼設計的。旅客A買了一張北京西(01號站)到保定東(02號站)的,那【北京西到保定東】這個商品的庫存就要減一,同時,北京西到石家莊、鄭州、武漢、長沙、廣州、虎門、深圳等15個站台的商品庫存也要減一,也就是說,出一張北京到保定東的票,實際上要減16個商品的庫存!這還不是最複雜的,如果旅客B買了一張北京西(01號站)到深圳北(17號站)的票,除了【北京西到深圳北】這個商品的庫存要減一,北京西到保定東、石家莊、鄭州、武漢、長沙、廣州、虎門等15個站台的商品庫存也要減1,保定東到石家莊、鄭州、武漢、長沙、廣州、虎門、深圳北等15個站台的商品庫存要減1。。。總計要減庫存的商品數是16+15+14+……+1=120個。當然,也不是每一張票都的庫存都完全這樣實時計算,可以根據往年的運營情況,在黃金周這樣的高峰時段,預先對票做一些分配,比如北京到武漢的長途多一點,保定到石家莊的短途少一點。我沒有證據證實鐵道部這樣做了,但我相信,在還沒有12306網站的時候,鐵道部就有這種人工預分配的策略了。想像一下,8萬人舉著錢對你高喊:賣給我。你好不容易在錢堆里找到一隻手,拿了他的錢,轉身找120個同事,告訴他們減庫存,而這120個同事也和你一樣被8萬人圍著;也和你一樣,每賣出一個商品要找幾十個人減庫存……這就是12306動態庫存的變態之處。實際上,看著更淘寶上的千千萬萬產品每時每刻都會有訂單有些類似,但是它只是跟淘寶上面的秒殺有類似並不是千千萬萬的商品都在秒殺,而且12306它後面的票池,還有電話售票、火車站售票、代售點售票等多個傳統渠道要服務。除了客運服務,12306還有全國最大(很可能也是全球最大)的大宗物資貨運系統。架空政策(包括定價政策、警方打擊黃牛政策、身份驗證政策)談技術,是不可能解決春運搶票困局的,要想讓春運的時候每個人在12306搶票都毫無擁擠感(但不一定能搶到票,鐵路運力擺在那),那就是逼著12306買一大堆伺服器對付春運,春運過去後,成為跟amazon一樣牛逼的雲計算服務商。和逼北京修一條10車道的高速公路去八達嶺長城一個道理。再說一下搶票插件,機器永遠比人快,當你好不容易從8萬人里突出重圍,來到了櫃檯前,你發現,我操,來了10萬根綁著錢的竹竿,而且當有退票出來的時候,你要闖過3層人肉才能接近櫃檯,竹竿在8個人身後一伸,錢就到了櫃檯前。你低頭看了一眼手機,票就沒了,竹竿卻永遠在那裡伸著,永不低頭,永不眨眼。如果沒有這10萬根竹竿,雖然你很可能還是搶不到票,但不至於沮喪成這樣:我TM為什麼總是手最慢的一個?!!防機器人搶票,也不是加個圖片驗證碼那麼簡單。我寫過文章系統性分析過,圖片驗證碼有6種機器暴力破解的辦法,搶票插件用的是我說的第三種,OCR識別(光學字元識別——觀察者網注)。Google採用的Wave波形字母已經能比較好地防住機器OCR了,ems.com.cn上的驗證碼就是反面教材,機器OCR成功率接近100%,12306的比ems的圖片驗證碼強一點。不過,驗證碼設置得複雜一點吧,人們要噴:這只是便宜大學生和辦公室白領,農民工連26個字母都認不齊,怎麼搞?搞動畫驗證碼吧,也有人噴,視力不好的人怎麼辦?最後驗證碼搞得太簡單了,皆大歡喜了,其實最高興的是開發搶票插件的公司。就算採用了機器完全不可能識別的驗證碼,也防不住社會工程學的破解辦法。招募一堆網吧打遊戲的青少年朋友,每成功輸入50個驗證碼給1塊錢,或者等值的虛擬貨幣、遊戲裝備,我保證想賺這個錢的人數不勝數。這點錢對轉賣車票的利潤而言,是可以接受的成本。有沒有什麼技術可以防住社會工程學的破解辦法呢?能防住網吧青少年的驗證碼只有【2克濃度為3%的U235在大亞灣核電站能發多少KW的電】
12306官方也會偷懶的好吧。除了上面說的數據量大是一個問題。你們應該發現,提前30天基本出來的都是起始站的票,中途站根本不放票的。中途站到預售時間都是瞬間沒有的。其實不是大家搶不到,是根本沒有放票。為了利益最大化,只放出了最長旅程的票。
各大APP商店超過80%給1星,還用問嗎。
訪問量大,數據刷新也快。
推薦閱讀:
※為什麼我們越來越不開心?
※於理,你可以我行我素,於情,你還是自己掂量吧……
※重讀《將太的壽司》有感
※梁文道:他們發不了聲,我們不該選擇忽視 | 八分
※「霸座男」,何以不知恥?