海子铁路网

 找回密码
 注册进站

QQ登录

只需一步,快速开始

查看: 6923|回复: 30

淘宝工程师对12306网站的看法,大家可以看下《转自百度火车吧》

[复制链接]
发表于 2014-1-12 16:33:23 | 显示全部楼层 |阅读模式
我曾在淘宝写过一段时间代码,2012年在一家百强民企做电商副总,当时在极为艰苦的条件下带队开发了一个B2C网站,走支付宝和银联支付通道,年营业额千万级(当然实在太少了,我只是
说这个网站投入了实际的运营)。

也就在那个时候,我对12306嗤之以鼻,觉得他们做得太烂了,认为自己能带队花几百万半年时间做个好的出来。于是我狂妄地想做一个开源的订票系统给他们。我花了一个星期时间思考建立
数据模型,思考到库存这一步的时候,我才发现,12306的库存复杂性比淘宝、京东高很多倍,运算量也大很多倍。传统的分布式数据库、缓存、负载均衡技术并不能恰好满足12306的需求。

在平时,12306也就是个正常的电商网站。但一到黄金周,12306就是一个全站所有商品都秒杀,所有SKU都是动态库存的变态。

即使不考虑线下既有的电话、代售点等渠道,要实现一个12306,最少最少也是千万级别的硬件投入(这是当时的估算,没有精算,可能与实际相差较大,总之,我说得不一定对,12306的业
务也许没我说的那么复杂,但也绝不是某些人喷的那么简单),软件和人力另算。那些叫嚣只要40台服务器、只要2个架构师4个程序员、大谈分库分表和前端CDN的人们,只是纸上谈兵罢了。
所谓初生牛犊不怕虎,做了三年CMS和BBS,就以这个经验来喷12306,未免太天真了。

媒体人喷12306,是他们不懂技术,没有能力和耐心来分析背后的难度。技术人员喷,则是因为大部分的技术人员在短时间思考时,容易陷入过于乐观的误区,经典的例子就是估算工作量,程
序员们往往容易估算出一个超短的工期,把写程序的工作乐观地想象成了打字员照稿敲键盘的工作。

知乎那篇文章,我觉得不是洗地。排名第一和第二的答案都说得很客观。淘宝技术是比12306强大很多倍,淘宝现在的系统也是花了10倍于12306的钱、时间和人才做起来的。根本原因还是铁
路运力不能满足春运需求,淘宝也解决不了这个问题。
12306这一年来进步非常大。从前段动画验证码、分时段抢票,到后端去小型机、虚拟化、内存数据库的运用。可以说,12306是中国政府机关做的最强大的网站(电商系统),能在短短一两
年内做出这样的改变,几乎是个奇迹,就连一些市场化的民企都望尘莫及,甚至一些上市公司都比不上它!(比如51job和ctrip)。

事非经过不知难,在网上批判12306的人,大部分还是形成了【国企 = 垄断 + 腐败 + 低效 】的思维定势。小部分是真的轻视了它的难度。

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

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

驾驶室镇楼

驾驶室镇楼
 楼主| 发表于 2014-1-12 16:34:34 | 显示全部楼层
再说动态库存。


淘宝秒杀天猫魔盒的时候,只有一个商品(行话叫做SKU),它的库存是15000个。有一个人秒杀到了,库存就减1,19秒卖完的,一秒要成功产生789个订单(下订单的请求可能是8万个,只是

可能啊,非实际数字,也可能是1万个,用于说明一下壮观程度)。想象一下,你在广场上卖火车票,一秒钟有8万人举着钱对你喊:卖给我!


上过大学的人都知道,比秒小的时间单位还有毫秒、皮秒、飞秒。但交易系统登记一个交易可不像电子绕着原子核跑一圈那么简单,它要做这些事:检查是否恶意访问、取到系统时间、取到

顾客默认收货地址、核对顾客秒杀资格(当时的规定是天猫T2.T3达人)、生成订单号、把顾客ID系统时间订单号收货地址写入订单系统、扣除顾客天猫积分、商品库存减一、给顾客打标记(

每人只能秒一个,下次不能秒了)等等,这每一件事都要花费毫秒级别的时间,这些操作加起来的时间可能是接近1秒级别的,但由于淘宝的服务器比较强悍,而且采用了分布式和集群技术,

结果比1秒理想一点。但即使有1万台服务器,也不能把这个时间稀释成万分之一秒,因为,商品只有一种,它有15000个库存,对应的数据库记录只有一行,所有的交易请求都要到这里来处理




能不能把这15000个拆分成5000个商品并分配到5000台服务器上呢?那样不就可以5000台服务器同时处理了吗?答案是不能,首先,5000个商品,意味着有5000个商品详情页,5000个购买按钮

,这对前期的营销、引流是个灾难。基本上就没法做引流入口了,显然这违背了商业管理原则,人为增加了信息混乱程度。其次,天猫魔盒秒杀也不是啥大事,即使按官方标价399元来计算,

也就6百万的交易。如果6百万的交易要花费那么大的配套成本,那就太不划算了。再次,淘宝有十几亿商品,这十几亿商品的展示交易和管理,本来就是分布到上万台服务器上去了。没有必

要再把每个商品按库存拆成多个商品了。


这789人抢到了,还不一定会付款(99积分换天猫魔盒还好一点,不需要去网银,成本也极低,大部分是会付款的,3999秒杀iPhone 5S就不一定,有人可能网银有问题,有人可能改变主意不

想要了),所以就又带来订单取消重新恢复库存的问题。还有想要的消费者们,会认为还有机会,继续在前台刷一会儿,最终这个秒杀会被热情的消费者们猛刷30秒到1分钟。


(超卖这一部分科普笔法写得有错误,鉴于12306目前全在内存数据库中读写,没有产生超卖问题,先把这个段落删去。感谢@吹西门的雪 指正)
 楼主| 发表于 2014-1-12 16:35:13 | 显示全部楼层
好了,讲了这半天淘宝,可以说12306了吧?


我以北京西到深圳北的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动态库存的变态之处。比你平时买东西的任何网站的库存机制都复杂几十上百倍。


再说一下抢票插件,机器永远比人快,当你好不容易从8万人里突出重围,来到了柜台前,你发现,我操,来了10万根绑着钱的竹竿,而且当有退票出来的时候,你要闯过3层人肉才能接近柜

台,竹竿在8个人身后一伸,钱就到了柜台前。你低头看了一眼手机,票就没了,竹竿却永远在那里伸着,永不低头,永不眨眼。如果没有这10万根竹竿,虽然你很可能还是抢不到票,但不至

于沮丧成这样:我TM为什么总是手最慢的一个?!!

防机器人抢票,也不是加个图片验证码那么简单。我写过文章系统性分析过,图片验证码有6种机器暴力破解的办法,抢票插件用的是我说的第三种,OCR识别。Google采用的Wave波形字母已

经能比较好地防住机器OCR了,ems.com.cn上的验证码就是反面教材,机器OCR成功率接近100%,12306的比ems的图片验证码强一点。不过,验证码设置得复杂一点吧,人们要喷:这只是便宜

大学生和办公室白领,农民工连26个字母都认不齐,怎么搞?搞动画验证码吧,也有人喷,视力不好的人怎么办?最后验证码搞得太简单了,皆大欢喜了,其实最高兴的是开发抢票插件的公

司。


就算采用了机器完全不可能识别的验证码,也防不住社会工程学的破解办法。招募一堆网吧打游戏的青少年朋友,每成功输入50个验证码给1块钱,或者等值的虚拟货币、游戏装备,我保证想

赚这个钱的人数不胜数。这点钱对转卖车票的利润而言,是可以接受的成本。有没有什么技术可以防住社会工程学的破解办法呢?能防住网吧青少年的验证码只有【2克浓度为3%的U235在大亚

湾核电站能发多少度电】。


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

12306还有全国最大(很可能也是全球最大)的大宗物资货运系统。


架空政策(包括定价政策、警方打击黄牛政策、身份验证政策)谈技术,是不可能解决春运抢票困局的,要想让春运的时候每个人在12306抢票都毫无拥挤感(但不一定能抢到票,铁路运力摆

在那),那就是逼着12306买一大堆服务器对付春运,春运过去后,成为跟amazon一样牛逼的云计算服务商。和逼北京修一条10车道的高速公路去八达岭长城一个道理。


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


但人家在进步。相信2014年春运的时候,技术已经不再是一票难求的主要问题。在铁路运力不可能神速增加(孙中山先生计划的20万公里铁路,土共修了快70年,才修到10万公里)的情况下

,要做到春运更公平地买票,需要停靠政策调整。
 楼主| 发表于 2014-1-12 16:35:52 | 显示全部楼层
下文针对的是春节国庆这种非常暑期。其它时期,大部分线路保持现状就行了,问题不大,极少部分票源紧张的线路可以按春运处理:


1. 拍卖法,价高者得之


当硬座票拍出飞机票价格的时候,相信票就不难买了(可惜就是贵了),也没有那么多黄牛了。要说淘宝有什么能帮12306一下子搞定技术问题的,淘宝的拍卖系统可以帮忙,浙江省高院在淘

宝拍卖一年多,成交26亿。


可惜这个方法不可能实行。现在的高铁票价都被媒体和意见领袖喷成啥样了,何况是拍卖。再说,火车票毕竟是生存之刚需,票价20年来不涨本来就有照顾补贴的成分在里面,全拍卖可能也

是不妥当。


2. 抽签法,运气好者得之


开车前2个月开放报名,开车前7天抽签,中途可取消。预存票款,抽不中退款。上传身份证和正脸自拍照,机器核对。


这样的话,拦截黄牛的成功率就高很多了,黄牛可以预存票款,可以找到大量真实身份证号,你黄牛再让每个给你身份证号的人把身份证照片和脸部自拍也给你试试?即使有人真想找黄牛,

给身份证照片还是会犹豫一下吧。而且中间手工操作多了很多,黄牛成本提高,还不一定搞得到票。反正都是碰运气,我想真正的消费者还是会选择自己先去碰运气吧。


这个方法实施难度也大,无论怎么设计抽签规则,必然有人大叫“有黑幕,不要相信政府”。


开车前7天出抽签结果,改变行程的人应该在7天前就能决定改还是不改了。没抽到的也还有时间想别的办法。当然不一定是7天,15天,10天也可以,具体几天要有数据模型来算。


3. 拍卖 + 抽签


软卧、高铁商务座等高价位的,拍卖,反正买这个的是经济能力相对较强的。那就拼谁经济能力更强吧。


硬座、站票抽签。


4. 凭身份证进站,车票跟发票一样,是报销凭证,不是进站凭证;退票后钱进入12306账户,不可提现,只可该乘客下次乘车用;黄金周期间,个人账号最多订购10张票


这个办法可以打击黄牛囤票再转卖


运行一段时间后,按账户余额弄个排行榜就知道谁是黄牛了


可惜这个需要车站设备改造配合。

-----------------搬运完成,欢迎讨论-------------------------


这也算是个科普文,喷子们要是再拿淘宝和12306比我就真没办法了。
发表于 2014-1-12 16:39:57 | 显示全部楼层
其实做软件编程什么的都是蛮辛苦的,可某些喷子我们就物理吐槽了。
 楼主| 发表于 2014-1-12 16:48:32 | 显示全部楼层
宁局桂段DF4B 发表于 2014-1-12 16:39
其实做软件编程什么的都是蛮辛苦的,可某些喷子我们就物理吐槽了。

做什么都不容易,互喷是不应该的
发表于 2014-1-12 17:09:37 | 显示全部楼层
拿出一等和特等的座位拍卖是个不错的思路。有需求的人付出高成本也不过分。中國的许多问题是不患寡而患不均。透明了怨气也就下去了。关键是许多人不懂。比如崔永元就不懂转基因,但是非要反对一样。
发表于 2014-1-12 18:02:04 | 显示全部楼层
最近这样的文章很多啊,到处都看到。很怀疑是12306内部人自己写的。

淘宝有4W台服务器,

原来雅虎搜索引擎也只有3200台服务器好象报纸上说到过。
 楼主| 发表于 2014-1-12 19:00:52 | 显示全部楼层
WSGC 发表于 2014-1-12 18:02
最近这样的文章很多啊,到处都看到。很怀疑是12306内部人自己写的。

淘宝有4W台服务器,

这个事情还真不好说
头像被屏蔽
发表于 2014-1-12 19:42:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2014-1-12 22:58:10 来自手机 | 显示全部楼层
去年京东某技术大牛喷12306说要搞个开源12306系统,网站还在只是屁都没搞成
发表于 2014-1-13 10:20:20 | 显示全部楼层
千里走单骑 发表于 2014-1-12 22:58
去年京东某技术大牛喷12306说要搞个开源12306系统,网站还在只是屁都没搞成

京东自己搞个抢购还卡呢1
发表于 2014-1-13 12:00:40 | 显示全部楼层
北方之东 发表于 2014-1-12 17:09
拿出一等和特等的座位拍卖是个不错的思路。有需求的人付出高成本也不过分。中國的许多问题是不患寡而患不均 ...

最后那句说到点子上了!
发表于 2014-1-13 12:14:11 | 显示全部楼层
写的够详细
发表于 2014-1-13 18:22:02 | 显示全部楼层
也许有点道理。在批评的同时,也应该看到12306毕竟在进步。
发表于 2014-1-13 18:33:17 | 显示全部楼层
我觉得喷12306 的好多都是各个电商的水军。
发表于 2014-1-13 19:00:09 来自手机 | 显示全部楼层
这个分析支持。
但是既然最终结论是整体系统瓶颈,为何不考虑入驻天河超算中心?
 楼主| 发表于 2014-1-13 19:19:36 | 显示全部楼层
huang0599 发表于 2014-1-13 18:22
也许有点道理。在批评的同时,也应该看到12306毕竟在进步。

是的,不应该只看不好的一面
 楼主| 发表于 2014-1-13 19:20:07 | 显示全部楼层
clw9981 发表于 2014-1-13 19:00
这个分析支持。
但是既然最终结论是整体系统瓶颈,为何不考虑入驻天河超算中心?

超算中心是个什么东东
发表于 2014-1-13 19:22:06 | 显示全部楼层
赣榆车站 发表于 2014-1-13 19:20
超算中心是个什么东东

超级计算机
您需要登录后才可以回帖 登录 | 注册进站

本版积分规则

手机版|小黑屋|Archiver|海子铁路网 ( 京ICP证120035号 京公网安备11010702001036 )

GMT+8, 2024-11-17 07:40

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表