先說結論,這次630,暴露出了魅族在Web這塊技術就是個渣的真相,當然,我也可以作證這次是真行銷,不是什麼噱頭,只是魅族的技術真心渣。
自從我的N5昨日掉進熱翔之後,出門左拐就看到魅族第二天做搶購,第二天還是全國20位搶到特價機的幸運兒之一,我不得不感歎一句...... N5不是我要你亡的- -
話說回來,昨晚看那個頁面的時候簡單分析了下HTML,僅僅只是個靜態頁面宣告630搶購的事宜。 而第二天9點我去公司之後,頁面內容改了,那一段銷魂的未做任何混淆的JS,暴露出了這次搶購的所有關鍵因素。
1. 時間同步,由於考慮到用戶端差異,魅族的做法是JS AJAX從伺服器端遠端同步時間,時間一到,搶購的按鈕class替換為go,這樣就會從灰色的XXX變為紅色的搶購按鈕。
2. 搶購,搶購的本質就是點下那個搶購按鈕,發起另一個AJAX請求到某個明文位址(僅僅就末尾加了個隨機時間),30秒Timeout,誰中了就會返回一個JSON,VALUE域裡面包含了購買位址,因為這是一次性的行銷, 我並不知道位址到底是什麼。
知道這2個關鍵因素之後,作為一個傲嬌的程式師,你要我用手去點? Naive,必須腳本啊...... 另外扯一句,按照頁面程式邏輯,瘋狂按刷新的還不如老老實實提前1個小時載入頁面,那時候魅族的伺服器還正常,能拿到伺服器的Timer,可以正常的等到12點按鈕變紅...... 再往後,Timer都拿不到了就別說搶手機了。
於是我直接寫了個腳本,起了20個Greenlet,2個Process等於40個併發,0.2秒一次構造請求獲取JSON,設定了0.1秒的Timeout並拋棄502的Response。 這個量我覺得算有良心了,200 QPS對於最終魅族公告出來的併發量可以忽略不計吧,而且95%基本都是502或者Timeout(還好我遮罩了)。
沒想到的是,11點40開始,魅族的伺服器502率開始大幅上升...... 關鍵就是那個Timer。 走伺服器Timer沒估算出正確的請求量就是死路一條啊...... 考慮到傳輸Overhead,其實我當時就想說這做伺服器端Timer有意義!? 而恰恰是這個Timer,第一波流量估計就拖垮了魅族的伺服器了,因為整個網站都開始抽風起來,這個時候我就知道,這搶購,懸。
考慮到只有100台特價MX3和微博上7位數的關注量,魅族你別告訴我就僅僅估計了十幾萬的併發? 3台滿載NGINX? 要我來做預算的話,沒做個百萬級併發的心理準備就不要攬這個活了,或者賣10K台的特價機來分散壓力,當然這個價格你我都知道不可能。 舉個對比的栗子,春運的時候一列火車按照超額50%不過2000人票,往死裡算一天有6位數的購票者足夠麼,這個比例鐵道部又投入了多少資源來解決,那可是業內最好的硬體了啊!
於是12點還差15分鐘的時候,幾乎99.9%的丟包率我就知道,基本上沒人能買到,中間有個小插曲是你們一定重啟了NGINX,在2個請求之內(0.2秒)瞬間502,當時我就呵呵了。 微博說自己搶到的都是扯蛋,老老實實去吃飯,1點多回來看結果。 然後1點多, 應該是魅族做了一次流量切換@嗷喵喵喵秋提到的那個mx3_630頁面位址出現在了Response的Value域裡面,一次還來了倆......
說時遲那時快,我和我同事同時點開了那個位址,他看到1800,我看到了630,加入訂單成功,付款成功,就是魅族這個付款流程啊,尼瑪支付寶付款完就跳不回去了,憑著訂單號還不讓我查詢,尼瑪老子要是能接短信還需要買手機嘛!
其實你看,腳本沒啥用,這種一次性秒殺最後還是看RP,打開MX3_630那個頁面的時候其實你還不一定能秒到的,那個傻逼添加按鈕也是個AJAX啊! 幹!
最後,談一下我對秒殺系統設計的一些看法。 目前來看,鐵道部的做法其實是最靠譜的...... 大量併發來了之後不要直接落入到傳統存儲上。 帶原子操作的Redis啊什麼的給草起來,一個良好的Redis集群可以單Instance提供2W的QPS,用Twemproxy做前端,接下來的事就不用我教了吧。 當然了這只是一個思路,大體上解決大併發大流量的一個大方向就是分散壓力,延遲處理。
所以搶購流程大體上會變為,使用者點搶購,排隊,等待排隊結果,這個體驗,至少比清一色的502要實在得多對不,你不一定要立刻顯示你是否搶到,但可以拿出誠意告訴使用者為啥你沒搶到。 所以啊,別看不起技術,看不起後端,魅族這次事件就是事前沒做好估算,搶購的時候後端設計太坑爹,結果一個好的行銷計畫搞成了這麼一個落魄的結果。
另外對於前端的保護也應該做到位,session等服務端驗證手段給祭出來,直接暴露位址加簡單的隨機時間你這是逗我呢? 手機都賣了這麼多了Web開發這塊跟大學生做出來的一樣我都不知道怎麼吐槽了...... 連我這個前端渣如狗的都能弄明白...... 黃牛隨便雇幾個人就能把魅族給刷成狗了,說真的這次還算是你們伺服器給立了功。
P.S. 利益相關,給自己最愛的姑娘買了一台魅族MX,當時考慮的就是要省心,她不喜歡iPhone國產的就只有魅族了,不過今年可能給她換新iPhone。 魅族在做一個開包即用省心省力的手機這塊確實比小米還是要靠譜得多一丟丟(小米最近幾年趕上來了),但是決定一個企業未來的,往往是木頭的那塊短板呀。
文/彭哲夫