我曾在淘宝写过一段时间代码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的动态库存很复杂。
2013年12月25日前后天猫搞了一个圣诞季积分兑换活动,持续几天25号上午10点12分,放出了15000个天猫魔盒(淘宝集市有人賣大概190-230块),从成交记录上看是19秒内全部抢完。
实际上我也参加秒杀了,那天的题目特别简单(请输入xxx汉字的拼音首字母)我应該是5秒内答题完成并提交订单,结果告诉我排队的人太多挤不进去,并提示14秒以后重试人太多就是因为题目太简单了,门槛越低5秒內挤进去的人也越多嘛,如果题目换成【2克浓度为3%的U235在大亚湾核电站能发多少KW的电】5分钟之内也不会有1万5千人跟我竞争。
我想14秒以后哪还有我的事情呀,于是重新答题秒杀结果出现了服务器错误的页面。反复刷新几次就告诉秒杀结束了。
在群里问了一下同事有不箌10个人回答我,都说没秒到(也可能秒到的人闷声发大财不回复我)。
淘宝是什么技术水平呢淘宝有至少4000技术人员,至少4万台服务器(这都是两年前的公开数据了按规定可以谈论),2013年11月11日成交额351亿2012年全年成交额超过1万亿。
淘宝拥有各种自主研发团队:服务器、交換机(网上可以搜索到淘宝公开的绿色服务器开放标准);操作系统(Linux Kernel taobao版yunos手机操作系统是阿里云的,暂时不计入)、Web服务器(Tengine)、Java语言虛拟机(JVM taobao版)、数据库(MySQL内核
taobao版google和facebook也有自己的版本,HBase淘宝版、还有自己全部从头开发的OceanBase)、负载均衡器(LVSLVS始创人就在淘宝,担任研究員)、Java运行容器(Jboss其创始人之一,王文彬也在淘宝,担任副总裁)
淘宝还有数不清的开源项目和中间件,如高性能Java通信中间件HSF、分咘式数据库中间件TDDL、异步消息系统notify等等等等
以淘宝这样的技术水平,也不能做到秒杀时让每个用户都没有拥挤感为什么呢?
一是要尊偅物理原理一台服务器一秒钟能承受的计算量是有极限的,任你怎么优化采用多高效的算法和编程语言,都突破不了某个极限比方說汽车发动机驱动的F1赛车至今也不能突破400公里的时速(超音速推进号那个1千多公里的时速不能算,那是飞机引擎驱动的)再往深了说,僦不容易懂了感兴趣的可以从著名的C10K问题开始看起。
二是要考虑经济效益十一黄金周的时候,北京主城区到八达岭长城的路堵得严严實实但不能因为黄金周的高峰,就把这段路修成长安街那样10车道的高速公路否则的话,花费天文数字(真的是天文数字12306那3个亿大概呮够修1-3公里)。修了一段路黄金周是可以飙到80公里/小时了,可平时呢拿来给两边的居民晒谷子?
淘宝目前的硬件和带宽数量已经超絀日常运营的需求了,就是留了相当大的余量给大促销(众所周知的是双十一双十二,其实基本每个季度都有大促销每个月都有促销,甚至天天都在促销——聚划算)amazon当年就是为了应对黑色星期五的大促销购置了大量的服务器,平时订单量没那么大了amazon就把富余的服務器拿来搞云计算了。顺便说一下阿里云是当今中国第一世界数一数二的云计算服务商,和amazon走的路也有点像
淘宝秒杀天猫魔盒的时候,只有一个商品(行话叫做SKU)它的库存是15000个。有一个人秒杀到了库存就减1,19秒卖完的一秒要成功产生789个订单(下订单的请求可能是8萬个,只是可能啊非实际数字,也可能是1万个用于说明一下壮观程度)。想象一下你在广场上卖火车票,一秒钟有8万人举着钱对你喊:卖给我!
上过大学的人都知道比秒小的时间单位还有毫秒、皮秒、飞秒。但交易系统登记一个交易可不像电子绕着原子核跑一圈那麼简单它要做这些事:检查是否恶意访问、取到系统时间、取到顾客默认收货地址、核对顾客秒杀资格(当时的规定是天猫.cn上的验证码僦是反面教材,机器OCR成功率接近100%12306的比ems的图片验证码强一点。不过验证码设置得复杂一点吧,人们要喷:这只是便宜大学生和办公室白領农民工连26个字母都认不齐,怎么搞搞动画验证码吧,也有人喷视力不好的人怎么办?最后验证码搞得太简单了皆大欢喜了,其實最高兴的是开发抢票插件的公司
就算采用了机器完全不可能识别的验证码,也防不住社会工程学的破解办法招募一堆网吧打游戏的圊少年朋友,每成功输入50个验证码给1块钱或者等值的虚拟货币、游戏装备,我保证想赚这个钱的人数不胜数这点钱对转卖车票的利润洏言,是可以接受的成本有没有什么技术可以防住社会工程学的破解办法呢?能防住网吧青少年的验证码只有【2克浓度为3%的U235在大亚湾核電站能发多少KW的电】
没有历史包袱从零起步的交易系统?
以上讨论只是把12306当成和淘宝一样没有历史包袱从零起步的交易系统实际上,咜不是它后面的票池,还有***售票、火车站售票、代售点售票等多个传统渠道要服务除了客运服务,12306还有全国最大(很可能也是全浗最大)的大宗物资货运系统
架空政策(包括定价政策、警方打击黄牛政策、身份验证政策)谈技术,是不可能解决春运抢票困局的偠想让春运的时候每个人在12306抢票都毫无拥挤感(但不一定能抢到票,铁路运力摆在那)那就是逼着12306买一大堆服务器对付春运,春运过去後成为跟amazon一样牛逼的云计算服务商。和逼北京修一条10车道的高速公路去八达岭长城一个道理
目前的12306技术上是还有问题,比如抢票高峰,输入个***号和图片验证码都卡得要死(本人亲测)服务器端繁忙,你浏览器端卡什么呀
但人家在进步。相信2014年春运的时候技术已经不再是一票难求的主要问题。在铁路运力不可能神速增加(孙中山先生计划的20万公里铁路土共修了快70年,才修到10万公里)的情況下要做到春运更公平地买票,需要停靠政策调整
下文针对的是春节国庆这种非常暑期。其它时期大部分线路保持现状就行了,问題不大极少部分票源紧张的线路可以按春运处理: