前淘宝工程师谈12306:做它比做淘宝难

jopen 9年前

        如果把 12306 外包给 IBM 或者阿里巴巴来做,能否比现在做得好?

        如果是以前,我肯定会回答:是。因为我们始终认为,一个年投入超 3 亿元的卖火车票网站,没有什么理由做不好吧?其实不光是小编这样认为,包括众多媒体,甚至专业人士都曾喷过 12306,但近日一名前淘宝工程师通过科普的方式给了我们一记响亮的耳光:做 12306 网站难度远高于淘宝。

        我曾在淘宝写过一段时间代码,2012 年在一家百强民企做电商副总,当时在极为艰苦的条件下带队开发了一个 B2C 网站,走支付宝和银联支付通道,年营业额千万级。

        在平时,12306 也就是个正常的电商网站。但一到黄金周,12306 就是一个全站所有商品都秒杀,所有 SKU (库存量单位,物流管理术语,编者注)都是动态库存的变态。

        媒体人喷 12306,是他们不懂技术,没有能力和耐心来分析背后的难度。技术人员喷,则是因为大部分的技术人员在短时间思考时,容易陷入过于乐观的误区。

        至于 12306 一期工程 3 个亿(含硬件)贵不贵我不评价,我只提供一个数字供参考,百度一年的研发费用(不含硬件)是 10 亿,这个数字来自百度财报。网上能查到。3 亿看起来好大一个数字,真用到超大型的电商系统、搜索引擎系统里面,其实也不算什么天文数字了。

        再解释一下,为什么秒杀压力大,以及为什么 12306 的动态库存很复杂。

前淘宝工程师谈12306:做它比做淘宝难

        先说秒杀:

        2013 年 12 月 25 日前后,天猫搞了一个圣诞季积分兑换活动,持续几天。25 号上午 10 点 12 分,放出了 15000 个天猫魔盒,从成交记录上看,是 19 秒内全部抢完。

        实际上,我也参加秒杀了,我应该是 5 秒内答题完成并提交订单,结果告诉我排队的人太多,14 秒以后重试。

        我想,14 秒以后哪还有我的事情呀,于是重新答题秒杀,结果出现了服务器错误的页面。反复刷新几次,就告诉秒杀结束了。

        淘宝是什么技术水平呢,淘宝有至少 4000 技术人员,至少 4 万台服务器。以淘宝这样的技术水平,也不能做到秒杀时让每个用户都没有拥挤感,为什么呢?

        一是要尊重物理原理。一台服务器一秒钟能承受的计算量是有极限的,任你怎么优化,采用多高效的算法和编程语言,都突破不了某个极限。

        二是要考虑经济效益。十一黄金周的时候,北京主城区到八达岭长城的路堵得严严实实,但不能因为黄金周的高峰,就把这段路修成长安街那样 10 车道的高速公路。

        再说动态库存:

        淘宝秒杀天猫魔盒的时候,只有一个商品(行话叫做 SKU),它的库存是 15000 个。有一个人秒杀到了,库存就减1,19 秒卖完的,一秒要成功产生 789 个订单。想象一下,你在广场上卖火车票,一秒钟有 8 万人举着钱对你喊:卖给我!

        好了,讲了这半天淘宝,可以说 12306 了吧?

        我以北京西到深圳北的 G71 次高铁为例,它有 17 个站,3 种座位。表面看起来,这不就是 3 个商品吗?G71 商务座、G71 一等座、G71 二等座。大部分轻易喷 12306 的技术人员就是在这里栽第一个跟头的。

        实际上,G71 有 136*3 =408 种商品(408 个 SKU),怎么算来的?请看:

        如果卖北京西始发的,有 16 种卖法(因为后面有 16 个站),北京西到:保定、石家庄、郑州、武汉、长沙、广州、虎门、深圳……都是一个个独立的商品,

        同理,石家庄上车的,有 15 种下车的可能,以此类推,单以上下车的站来计算,有 136 种票:16+15+14…+2+1=136。每种票都有 3 种座位,一共是 408 个商品。

        旅客A买了一张北京西(01 号站)到保定东(02 号站)的,那【北京西到保定东】这个商品的库存就要减一,同时,北京西到石家庄、郑州、武汉、长沙、广州、虎门、深圳等 15 个站台的商品库存也要减一,也就是说,出一张北京到保定东的票,实际上要减 16 个商品的库存!

        这还不是最复杂的,如果旅客B买了一张北京西(01 号站)到深圳北(17 号站)的票,除了【北京西到深圳北】这个商品的库存要减一,北京西到保定东、石家庄、郑州、武汉、长沙、广州、虎门等 15 个站台的商品库存也要减1,保定东到石家庄、郑州、武汉、长沙、广州、虎门、深圳北等 15 个站台的商品库存要减1……总计要减库存的商品数是 16+15+14+…+1=120 个。

        想象一下,8 万人举着钱对你高喊:卖给我。你好不容易在钱堆里找到一只手,拿了他的钱,转身找 120 个同事,告诉他们减库存,而这 120 个同事也和你一样被 8 万人围着;也和你一样,每卖出一个商品要找几十个人减库存……这就是 12306 动态库存的变态之处。比你平时买东西的任何网站的库存机制都复杂几十上百倍。

        再说一下抢票插件,防机器人抢票,也不是加个图片验证码那么简单。验证码设置得复杂一点吧,人们要喷:这只是便宜大学生和办公室白领,农民工连 26 个字母都认不齐,怎么搞?搞动画验证码吧,也有人喷:视力不好的人怎么办?最后验证码搞得太简单了,皆大欢喜了,其实最高兴的是开发抢票插件的公司。

        以上讨论只是把 12306 当成和淘宝一样没有历史包袱从零起步的交易系统,实际上,它不是,它后面的票池,还有电话售票、火车站售票、代售点售票等多个传统渠道要服务。除了客运服务,12306 还有全国最大(很可能也是全球最大)的大宗物资货运系统。

        架空政策(包括定价政策、警方打击黄牛政策、身份验证政策)谈技术,是不可能解决春运抢票困局的,要想让春运的时候每个人在 12306 抢票都毫无拥挤感(但不一定能抢到票,铁路运力摆在那),那就是逼着 12306 买一大堆服务器对付春运,春运过去后,成为跟 amazon 一样牛逼的云计算服务商。和逼北京修一条 10 车道的高速公路去八达岭长城一个道理。

        目前的 12306 技术上是还有问题,比如,抢票高峰,输入个身份证号和图片验证码都卡得要死(本人亲测),服务器端繁忙,你浏览器端卡什么呀?

        但人家在进步。相信 2015 年春运的时候,技术已经不再是一票难求的主要问题。在铁路运力不可能神速增加的情况下,要做到春运更公平地买票,需要靠政策调整。

来自: 投资界