先说结论,这次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。魅族在做一个开包即用省心省力的手机这块确实比小米还是要靠谱得多一丢丢(小米最近几年赶上来了),但是决定一个企业未来的,往往是木头的那块短板呀。
文/彭哲夫