12360网站技术探讨作者:协策网络-客服部 标签:网站制作 日期:2014年01月15日 类别:网站建设 |
||||
本人淘宝技术专家,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亿,这个数字来自baidu财报。网上能查到。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版,谷歌和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技术上是还有疑问,比如,抢票顶峰,输入个身份证号和图片验证码都卡得要死(本人亲测),服务器端繁忙,你浏览器端卡啥呀。
但人家在进步。信任2014年春运的时分,技术已经不再是一票难求的首要疑问。在铁路运力不能够神速增加的情况下,要做到春运更公平地买票,需求停靠方针调整。
下文针对的是春节国庆这种非常暑期。其它时期,大多数线路保持现状就行了,疑问不大,极少部分票源严重的线路能够按春运处置:
1、拍卖法,价高者得之
当硬座票拍出飞机票价格的时分,信任票就不难买了(惋惜即是贵了),也没有那么多黄牛了。要说淘宝有啥能帮12306一会儿搞定技术疑问的,淘宝的拍卖体系能够帮忙,浙江省高院在淘宝拍卖一年多,成交26亿。
惋惜这个方法不能够实行。现在的高铁票价都被媒体和意见领袖喷成啥样了,何况是拍卖。再说,火车票毕竟是生存之刚需,票价20年来不涨本来就有照顾补助的成分在里边,全拍卖能够也是不妥当。
2、抽签法,命运好者得之
开车前2个月开放报名,开车前7天抽签,中途可撤销。预存票款,抽不中退款。上载身份证和正脸自拍照,机器核对。
这样的话,拦截黄牛的成功率就高很多了,黄牛能够预存票款,能够找到大量真实身份证号,你黄牛再让每个给你身份证号的人把身份证照片和脸部自拍也给你试试?即使有人真想找黄牛,给身份证照片仍是会犹疑一下吧。而且中心手工操作多了很多,黄牛成本提高,还不必定搞得到票。反正都是碰命运,我想真正的消费者仍是会选择自个先去碰命运吧。
这个方法实施难度也大,无论怎么设计抽签规则,必定有人大叫“有黑幕,不要信任政府”。
开车前7天出抽签结果,改动行程的人应该在7天前就能决定改仍是不改了。没抽到的也还有时刻想别的方法。当然不必定是7天,15天,10天也能够,具体几天要有数据模型来算。
3、拍卖+抽签
软卧、高铁商务座等高价位的,拍卖,反正买这个的是经济才能相对较强的。那就拼谁经济才能更强吧。
硬座、站票抽签。
4、凭身份证进站,车票跟发票相同,是报销凭据,不是进站凭据;退票后钱进入12306账户,不可提现,只可该乘客下次乘车用;黄金周期间,自己账号最多订购10张票。
这个方法能够打击黄牛囤票再转卖;运转一段时刻后,按账户余额弄个排行榜就知道谁是黄牛,惋惜这个需求车站设备改造合作。本人淘宝技术专家,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亿,这个数字来自baidu财报。网上能查到。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版,谷歌和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技术上是还有疑问,比如,抢票顶峰,输入个身份证号和图片验证码都卡得要死(本人亲测),服务器端繁忙,你浏览器端卡啥呀。
但人家在进步。信任2014年春运的时分,技术已经不再是一票难求的首要疑问。在铁路运力不能够神速增加的情况下,要做到春运更公平地买票,需求停靠方针调整。
下文针对的是春节国庆这种非常暑期。其它时期,大多数线路保持现状就行了,疑问不大,极少部分票源严重的线路能够按春运处置:
1、拍卖法,价高者得之
当硬座票拍出飞机票价格的时分,信任票就不难买了(惋惜即是贵了),也没有那么多黄牛了。要说淘宝有啥能帮12306一会儿搞定技术疑问的,淘宝的拍卖体系能够帮忙,浙江省高院在淘宝拍卖一年多,成交26亿。
惋惜这个方法不能够实行。现在的高铁票价都被媒体和意见领袖喷成啥样了,何况是拍卖。再说,火车票毕竟是生存之刚需,票价20年来不涨本来就有照顾补助的成分在里边,全拍卖能够也是不妥当。
2、抽签法,命运好者得之
开车前2个月开放报名,开车前7天抽签,中途可撤销。预存票款,抽不中退款。上载身份证和正脸自拍照,机器核对。
这样的话,拦截黄牛的成功率就高很多了,黄牛能够预存票款,能够找到大量真实身份证号,你黄牛再让每个给你身份证号的人把身份证照片和脸部自拍也给你试试?即使有人真想找黄牛,给身份证照片仍是会犹疑一下吧。而且中心手工操作多了很多,黄牛成本提高,还不必定搞得到票。反正都是碰命运,我想真正的消费者仍是会选择自个先去碰命运吧。
这个方法实施难度也大,无论怎么设计抽签规则,必定有人大叫“有黑幕,不要信任政府”。
开车前7天出抽签结果,改动行程的人应该在7天前就能决定改仍是不改了。没抽到的也还有时刻想别的方法。当然不必定是7天,15天,10天也能够,具体几天要有数据模型来算。
3、拍卖+抽签
软卧、高铁商务座等高价位的,拍卖,反正买这个的是经济才能相对较强的。那就拼谁经济才能更强吧。
硬座、站票抽签。
4、凭身份证进站,车票跟发票相同,是报销凭据,不是进站凭据;退票后钱进入12306账户,不可提现,只可该乘客下次乘车用;黄金周期间,自己账号最多订购10张票。
这个方法能够打击黄牛囤票再转卖;运转一段时刻后,按账户余额弄个排行榜就知道谁是黄牛,惋惜这个需求车站设备改造合作。 您可能感兴趣的文章推荐 |
||||
|