看到有余票下單卻余票不足,是太慢?
2015年11月29日13:23 http://m.zbrx.net.cn
搶票開(kāi)始了,很多用戶被提示搞得懊惱,心情若過(guò)山車般起落。特別是這樣一組提示:
1、余票不足!
2、沒(méi)有足夠的票!
3、目前排隊(duì)人數(shù)已經(jīng)超過(guò)余票張數(shù),請(qǐng)您選擇其他席別或車次。
明明是看到余票查詢結(jié)果里有幾張,甚至上百?gòu)埰?,一下單就這提示,你說(shuō)氣人不?出提示了,立即再回過(guò)頭去刷新余票,依然顯示余票一張未少,這是鬧哪樣,逗人玩兒呢?
帶著這些問(wèn)題,小編和技術(shù)做了一個(gè)討論,結(jié)果是:這完全是12306一種不得已而為之的用戶體驗(yàn)讓步技術(shù)方案,導(dǎo)致這一讓步的原因則是www.12306.cn的搶票訪問(wèn)壓力。應(yīng)對(duì)瞬間巨大的訪問(wèn)壓力,12306網(wǎng)站采用了如下2種技術(shù):
1、購(gòu)買大量的CDN服務(wù)器,進(jìn)行余票數(shù)據(jù)緩存分發(fā);
2、下單過(guò)程采用排隊(duì)分配車票機(jī)制。
余票數(shù)據(jù)通過(guò)CDN服務(wù)緩存后,就不是分配票服務(wù)器的實(shí)時(shí)數(shù)據(jù)了。余票信息采用緩存分發(fā),主要是根據(jù)普通用戶購(gòu)票的行為來(lái)的,普通用戶大多是查過(guò)來(lái)看過(guò)去地比較,最后才決定下單購(gòu)買,也有用戶比較了一通,最后甚至并不購(gòu)買。這樣就導(dǎo)致查詢余票(下行)接口的訪問(wèn)是下單接口訪問(wèn)的幾十倍,甚至幾百倍。給查看的余票數(shù)據(jù)就被專門(mén)分離出來(lái),只要“應(yīng)付”一下大多數(shù)人看看的需要即可,真正需要購(gòu)票的用戶,會(huì)提交訂單申請(qǐng),再實(shí)時(shí)分配。
緩存也是動(dòng)態(tài)的,當(dāng)一個(gè)用戶發(fā)起查詢余票的網(wǎng)絡(luò)請(qǐng)求時(shí),域名服務(wù)器會(huì)根據(jù)網(wǎng)絡(luò)就近原則分配一個(gè)實(shí)際的CDN節(jié)點(diǎn)給用戶。CDN根據(jù)查詢條件查看自己的緩存是否有沒(méi)過(guò)期的數(shù)據(jù),若存在就立即返回給用戶,不存在才請(qǐng)求分配票服務(wù)器的實(shí)時(shí)余票信息。一個(gè)CDN節(jié)點(diǎn)通常是同區(qū)域的很多人同時(shí)使用,因此緩存也是共享的。即便你之前未訪問(wèn)過(guò),也可能其他用戶請(qǐng)求過(guò)同樣條件的余票信息,因此數(shù)據(jù)也是舊的。這個(gè)緩存時(shí)間具體是多少?這個(gè)就只能是12306的運(yùn)維人員能說(shuō)清了。分離出來(lái)的緩存數(shù)據(jù)已經(jīng)能足夠快反應(yīng)用戶請(qǐng)求了,為了防止無(wú)謂(相同數(shù)據(jù))的網(wǎng)絡(luò)傳輸,余票接口還限制了刷新時(shí)間間隔。
搶票時(shí)大量的用戶查詢到了余票,同時(shí)迅速提交訂單(上行),12306技術(shù)人員發(fā)現(xiàn)即便分離緩存了余票信息,下單接口還是面臨巨大的并發(fā)壓力,導(dǎo)致系統(tǒng)擁堵僵死。這時(shí),有聰明人就把現(xiàn)實(shí)中的排隊(duì)邏輯運(yùn)用在了分配車票這件事上。首先,迅速大量地收下來(lái)大家的購(gòu)票請(qǐng)求,同時(shí)按照先后次序排隊(duì);另一方面,用一系列算法來(lái)給大家的請(qǐng)求慢慢分配票,比如,60歲以上的先分配下鋪等等。
搶票過(guò)程講究的是盡快查詢到余票后,盡快提交訂單,不要浪費(fèi)無(wú)謂的時(shí)間而耽誤成功購(gòu)票。買火車票APP首先讓你準(zhǔn)備好訂單需要的車次、坐席,以及購(gòu)票人數(shù)據(jù),在遵守CDN服務(wù)器的規(guī)則下查詢余票,查到余票后立即申請(qǐng)訂單,隨即把下單驗(yàn)證碼交給熟練的客服人員用電腦鼠標(biāo)輸入,然后立即提交訂單。整個(gè)過(guò)程一氣呵成,在穩(wěn)定的基礎(chǔ)上追求速度的極致,當(dāng)然,網(wǎng)絡(luò)網(wǎng)速,以及不可預(yù)知的緩存對(duì)查到余票的影響也是導(dǎo)致失敗的一些重要原因。在條件一定的情況下,其實(shí)不用太刻意責(zé)怪自己的搶票太慢,你已經(jīng)比那些不借助任何工具軟件的搶票人要快很多了。
當(dāng)然,當(dāng)出現(xiàn)文章開(kāi)頭說(shuō)的3種提示時(shí),表示本次票庫(kù)的票已經(jīng)分配完了,不用抓狂地再次立即狂點(diǎn)[下單]或[監(jiān)控買票],否則只能增加自己的懊惱情緒!你可以重新定義托管任務(wù)為“代下訂單”,靜候有人退票、限售解禁等購(gòu)票機(jī)會(huì)。