转载一篇某博主写的关于淘宝和12306的分析

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万亿。

淘宝拥有各种自主研发团队:服务器、交换机(网上可以搜索到淘宝公开的绿色服务器开放标准);操作系统(LinuxKerneltaobao版,yunos手机操作系统是阿里云的,暂时不计入)、Web服务器(Tengine)、Java语言虚拟机(JVMtaobao版)、数据库(MySQL内核taobao版,google和facebook也有自己的版本,HBase淘宝版、还有自己全部从头开发的OceanBase)、负载均衡器(LVS,LVS始创人就在淘宝,担任研究员)、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万人举着钱对你喊:卖给我!

上过大学的人都知道,比秒小的时间单位还有毫秒、皮秒、飞秒。但交易系统登记一个交易可不像原子绕着原子核跑一圈那么简单,它要做这些事:检查是否恶意访问、取到系统时间、取到顾客默认收货地址、核对顾客秒杀资格(当时的规定是天猫T2.T3达人)、生成订单号、把顾客ID系统时间订单号收货地址写入订单系统、扣除顾客天猫积分、商品库存减一、给顾客打标记(每人只能秒一个,下次不能秒了)等等,这每一件事都要花费毫秒级别的时间,这些操作加起来的时间可能是接近1秒级别的,但由于淘宝的服务器比较强悍,而且采用了分布式和集群技术,结果比1秒理想一点。但即使有1万台服务器,也不能把这个时间稀释成万分之一秒,因为,商品只有一种,它有15000个库存,对应的数据库记录只有一行,所有的交易请求都要到这里来处理。

能不能把这15000个拆分成5000个商品并分配到5000台服务器上呢?那样不就可以5000台服务器同时处理了吗?答案是不能,首先,5000个商品,意味着有5000个商品详情页,5000个购买按钮,这对前期的营销、引流是个灾难。基本上就没法做引流入口了,显然这违背了商业管理原则,人为增加了信息混乱程度。其次,天猫魔盒秒杀也不是啥大事,即使按官方标价399元来计算,也就6百万的交易。如果6百万的交易要花费那么大的配套成本,那就太不划算了。再次,淘宝有十几亿商品,这十几亿商品的展示交易和管理,本来就是分布到上万台服务器上去了。没有必要再把每个商品按库存拆成多个商品了。

这789人抢到了,还不一定会付款(99积分换天猫魔盒还好一点,不需要去网银,成本也极低,大部分是会付款的,3999秒杀iPhone5S就不一定,有人可能网银有问题,有人可能改变主意不想要了),所以就又带来订单取消重新恢复库存的问题。还有想要的消费者们,会认为还有机会,继续在前台刷一会儿,最终这个秒杀会被热情的消费者们猛刷30秒到1分钟。

一分钟过去了,服务器终于可以喘口气了吧?等等,还有超卖,原来,某两台服务器在同一毫秒都拿到了锁,都去减了库存,15000个库存,被下了15500 个订单,又得取消一部分订单。。。如果采用单线程独占锁,是可以做到同时只有一个服务器线程减库存的,但那样就对并发高峰的能力就差了好多了。8万人举着钱,可能只有8个人能下单成功,这个拥挤狂热的抢购就要持续10分钟以上。平时秒个天猫魔盒,10分钟也就10分钟吧,双十一就惨了,收银台一下子减少了 90%,还想做到350亿,要么做梦,要么再加10倍服务器和带宽。所以,商业是不完美的,要在绝对正确和绝对的快速之间做个取舍,保证相对快速又极为正确,允许一定的库存错误和超卖(具体允许多少我也不知道)。

好了,讲了这半天淘宝,可以说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在大亚湾核电站能发多少KW的电】。

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

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

关于淘宝和12306的分析相关推荐

  1. 淘宝登录取Cookie分析

    淘宝登录取Cookie分析 二维码登录 二维码登录 通过手机扫描二维码登录,整体步骤如下: 打开网页,定位到二维码标签,点击,让登陆框载入二维码 : 等待扫码,同时判断二维码是否过期,过期则刷新二维码 ...

  2. 如何用mysql对淘宝用户行为进行分析

    一.项目背景和目的 项目集中于对淘宝用户行为的分析,如购买时段的分析.热销商品的分析.用户行为转化漏斗分析以及通过RFM模型对用户进行分类等,希望从中探索用户购买的规律,并将这些规律与店铺营销策略相结 ...

  3. python 淘宝用户行为数据集 分析与数据源

    利用Python对淘宝用户行为进行分析 源数据来源于: https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1 可以 ...

  4. iOS 手机淘宝加入购物车动画分析

    iOS 手机淘宝加入购物车动画分析 1.最终效果 仿淘宝动画 2.核心代码 _cartAnimView=[[UIImageView alloc] initWithFrame:CGRectMake(_p ...

  5. Spark商业案例与性能调优实战100课》第11课:商业案例之通过纯粹通过DataFrame分析大数据电影点评系仿QQ和微信、淘宝等用户群分析与实战

    Spark商业案例与性能调优实战100课>第11课:商业案例之通过纯粹通过DataFrame分析大数据电影点评系仿QQ和微信.淘宝等用户群分析与实战

  6. 网购到火车票 浅析淘宝和12306网站架构

    12306火车票购票系统,逢假日必瘫痪,引发了强烈反响.国庆前后,"问诊12306"的时候,铁道系统的答复是,购票人数太多,数据量过大.但 是,在前不久淘宝双11大促活动中,淘宝双 ...

  7. 淘宝Tprofiler工具实现分析

    工具介绍 TProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对象创建热点 线程状态分析等数据,为查找系统性能瓶颈提供数 ...

  8. 淘宝质量属性场景分析

    ·可用性 是指系统正常运行时间的比例,是通过两次故障之间的时间长度或在系 统崩溃情况下能够恢复正常运行的速度来衡量的,与系统故障及其后果相 关. ·可修改性 修改局部不会影响整体,不会发生连锁反应. ...

  9. 利用Python对淘宝用户行为进行分析

    1. 项目背景 该项目的数据集来源于天池,是由阿里巴巴提供的一个淘宝用户行为数据集,其中包含了2017年11月25日至2017年12月3日之间,一百万个随机用户的所有用户行为(行为包括点击.购买.加购 ...

  10. 淘宝密码加密方式分析,及python实现

    上回说到<分析淘宝登陆对selenium爬虫的封杀方案,反爬虫机制的升级>.<淘宝封杀selenium的ua算法分析>,对淘宝封杀Selenium的思路有了一个清晰认识,核心就 ...

最新文章

  1. Silverlight Toolkit DataGrid - 单元格内容对齐样式
  2. 《Scala机器学习》一一第3章 使用Spark和MLlib
  3. 【双十二】电商们的文案大战,猫狗快被玩坏了!
  4. Django笔记(1)
  5. 红旗linux培训文档,Linux基本应用培训-红旗Linux.ppt
  6. Codeforces 776D The Door Problem
  7. 用jQuery实现简单的加入收藏页面的功能
  8. hdu1711(kmp纯模板)
  9. ajax跨域问题解决(spring boot)
  10. ARCore 1.7可轻松打造AR自拍照及动画Augmented Faces API
  11. android框架揭秘之Java服务学习笔记
  12. 使用 JavaScript 制作一个可以弹的吉他
  13. hdu5855二分+最大流
  14. 求椭圆的切线方程------很有对称美
  15. 计算机与u盘连接使用,u盘虽然与电脑连接,但是插上后却没有反应,这该如何解决?...
  16. 自动化车间3D可视化设计思路
  17. 计算机管理员考核指标库,仓库管理员绩效考核指标.docx
  18. eclipse 自动提示报错解决方案
  19. JAVA毕设项目甜趣网上蛋糕店订购系统(java+VUE+Mybatis+Maven+Mysql)
  20. 解决Git push报错Unable to access ‘xxx‘: Failed to connect to github.com port 443: Timed out

热门文章

  1. linux拷贝4g以上文件夹,32位Ubuntu中支持超过4G的大内存的方法
  2. Vue 3 Composition API - “ref”和“reactive”
  3. 怎么将多张图片批量转为 Word 、Excel 、PPT 、PDF 等文档格式
  4. 微型计算机硬件调研报告,计算机硬件市场调研报告
  5. 理科生毕业,如何写论文,为论文降重
  6. python标准差不用numpy_Python numpy标准差
  7. 考研政治——马克思主义唯物论之物质观
  8. PowerDesigner修改设置表格背景色
  9. oracle数据库的关于建表的sql语句练习
  10. 助你迈向成功之路的二十二个好习惯