网购到火车票浅析淘宝和12306网站架构2012年11月22日09:32 摘自网络12306火车票购票系统,逢假日必瘫痪,引发了强烈反响国庆前后,"问诊12306”的时 候,铁道系统的答复是,购票人数太多,数据量过大但是,在前不久淘宝双11大促活动 中,淘宝双十一总交易金额 191亿,订单1亿零580万笔,其中无线支付近900万笔,支付宝 核心数据库集群处理了41亿个事务,执行285亿次SQL,生成15TB日志,访问1931亿次 内存数据块,13亿个物理读,核心MySQL集群一天支持了20亿个事务12306火车票系 统和其相比,真是天上地下12306为何如此烂?306备忘录国何约有2000万鯛翔户无i去枉纯订火车贏20TQ年1月柑日1為皿试运行2011年E月讦日 韭乍臣户无法订票.2011SWJ6H12B2011^9^3002D11 年 12§11BT字头擬车可网络购県26.5%4 60万张冈塘#皑话订瞬2012^1 月 2 曰 铁蹈部门共售车頂603.7万张2011 年 12H19H |K13&K500列牟 F可网络订離V日均点击数超勺0亿 2012^1月1日那日 雷注册用户超4 000万AlExa世界排名2卸 珂毎天售黑迭2D 0万张吕单掾或世界第_is日均点击^14.9(5超过春运2012 ^:0 月 20 日 铁道部致献2年9月"曰駆黑瘠1灵排限2 013年春节20与年元旦出品:搜狐IT 制图:©iPhone—姐◎毛后盈rii^ioqlyiricj.r.sobiLi.GQrri1. 淘宝技术被人称赞在刚刚过去的淘宝双11大促活动中,淘宝的技术支撑受到了网民的追捧。
据来自支付 宝DBA@dbatools的透露:淘宝双十一总交易金额191亿,订单1亿零580万笔,其中无线支付近900万笔,支付宝核心数据库集群处理了 41亿个事务,丸行285亿次SQL,生成15TB 日志,访问1931亿次内存数据块,13亿个物理读,核心MySQL集群一天支持了 20亿个事 务淘宝的技术人员以实际行动让网民折服,虽然在淘宝双十一活动刚开始的10分钟内的 访问高峰期内,购物车和支付宝都出现了打不开的情况,旦订单可以生成,而且白天的系统 运行比较正常双十一期间,淘宝除了技术上的保障,还有大量的运维策略的支持,比如在 峰值期间下订单优先级最高,支付可以晚点儿,大额度的订单优先处理等等淘宝网采用什么技术架构来实现网站高负载的呢?据淘宝技术人员分享,淘宝的整体架 构使用了如下措施来应对:一应用无状态(淘宝session框架);二有效使用缓存(Tair)三应用拆分(HSF);四数据库拆分(TDDL);五异步通信(Notify);六非结构化数据存储仃FS,NOSQL);七 监控、预警系统;八配置统一管理SIill*:ftUK/ TiiTfr鯛v DH ]IDB2 WAfc FHlTOP2. 12306网站被人诟病淘宝强大的技术实力,很容易让人们联想到让人"一票难求”的订票网站-12306。
12306网站购票难的问题几乎成了所有人的共识来自前支付宝架构师冯大辉(@Fenng )的这条微博翻出12306这笔账,别有一番滋味以冯大辉的计算方法,支付宝11月11日一天就处理了 1亿零580万条交易请求量,而 12306—天处理的交易(出票量)仅仅166万条,这还主要是集中在8点钟开始放票之后的5分 钟时间里从结果来看,12306弱爆了,处理的交易量比支付宝"低了两个数量级"还那么 弱不禁风冯大辉的微博马上得到了 @caoz的转发响应,后者在9月底对12306的骂战中一战成 名,由于观点相似,caoz和Fenng可以称为统一战线一一当然,众多对12306充满怨恨的 普通购票者也与他们在感情上统一战线简单分析一下12306的购票系统,为避免“黄牛”买票,购票系统有一个业务逻辑:一 个有效身份证件同一乘车日期同一车次限购一张车票因此购买一张车票可以简化为包含四 个操作:1) 判断同一乘车日期同一车次是否有未预订的空余座位2) 判断这个有效身份证是否已购买过同一乘车日期同一车次的车票3) 车票上标注的座位标记为已预订4) 如果没有购买过,则该身份证预订一张车票人们在12306网站上购买一张票的流程如下:1) 用户通过浏览器访问系统URL2) 界面集群F5将请求转发至某一节点,通过比较用户数据库的内容进行身份鉴权。
3) 鉴权成功后进入订票,提交订票订单(查询流程暂不讨论)界面显示请等待4) 订票消息被发送至总线部件(接口可用webService、RMI、甚至自定义协议都可以)5) 总线收到订票消息、去Cache集群查询相关车次6) Cache根据自身维护的车次余票表,返回查询结果,如果有余票,转7)如果无票了, 则总线返回界面集群"没票了",界面提示用户明天再试7) 若有余票,则总线返回界面集群“正在出票,请等待",并将订票请求压入队列且 发消息至Cache,告诉CACHE将订票请求加入队列8) Cache收到总线队列增加1个的消息,将自身维护的对应车次余票数减1个9) 总线另一线程负责从队列中取消息,并发送至出票部件10) 出票部件产生订票结果,并修改数据库,发送"订票成功"消息回总线11) 总线将订票成功消息直接回传至界面集群12) 用户看到订票结果3. 跟淘宝相比, 12306网站的有独特的技术难度1) 火车票属于竞争性资源淘宝的交易是相对离散的,分散在成千上万的卖家当中, 同时对同一商家同一商品的并发购买并不是特别高因此在数据访问上不会有太大的锁同一 数据的瓶颈,买火车票在这方面压力会更大,最主要的原因还是僧多粥少的。
火车票是几千 人,几万人抢一张票,火车票的抢购场景也只有在淘宝秒杀的时候可以类比,但是网民参与 的秒杀也很难成功秒杀到商品2) 火车票资源稀缺,需要同线下数以万计的购票点、订票等进行互斥每张火车 票都是独一无二的,网络售票只是数以万计的购票终端的一个终端而已,需要跟其他售票系 统保持数据一致性淘宝的商品只需要查询库存量就可以了举个粗略的例子,火车票的供 需关系可能是1 : 10,淘宝货品与消费者的供需关系可能是10 : 1,技术革新解决不了某种 商品严重供不应求的本质问题淘宝上的商品天然没有全局一致性的问题,做技术上做分区 优化就简单得多了火车票买卖的每笔业务都要互斥,以检查有没有票,一个人是否买了多 张票等等从这个角度可以理解为卖票问题的技术难度大得多,属于世界级难题3)火车票的信息是实时更新的网民的每次操作都必须到后台查询,实时生成新的火车票的状态信息淘宝商品库存信息在促销期间不准确,这是服务端为了关键性能做妥协; 但订火车票,库存信息必须是实时的铁道部2012年春运每天安排大约2000对列车,座位 大概400万个,因为每个座位都可能有不同的购票方式(火车票代售点、订票等),所以 都需要计算,提前10天预售,应该有点类似于taobao同时提供400万件商品的秒杀活动。
4) 票务业务的复杂性非商品信息可比选票最大的问题不是直达,是换车!只要有换车, 计算量级都是"次方”往上增加比如上海-西安,中间在郑州换但系统计算的时候会出 现“上海-北京-西安”的路线,这条线路是没有选的,但会消耗计算资源,2000条线路+ 临时车+换乘,还有就是瞬间的并发,这个也是一个问题5) 12306网站后面的票务系统问题12306网站不是一个孤立的系统,虽然这网站也 很多地方可以优化,但估计最大的瓶颈是后面那个和全国的代售点火车站共用的票务系统 真正的火车票数据库是在铁路系统中独立存在的这个铁路系统反应慢才是制约12306网站 慢的主因所以最大问题可能不是负载并发问题,而是老票务系统的问题票务系统采用的 是突然放票,而有的票又远远不够大家分,所以,大家才会有抢票这种有中国特色的业务的 做法于是当票放出来的时候,就会有几百万人甚至上千万人杀上去,查询,下单几十分 钟内,一个网站能接受几千万的访问量,这个是很恐怖的事情据说12306的高峰访问是10 亿PV,集中在早8点到10点,每秒PV在高峰时上千万这需要逐步全面革新6) 独特的车票预留问题传统票务系统有一个比较复杂的地方就是各种预留票规则, 每个城市,每个节日都有很多的复杂留票规则,导致很多时候头十天一张卧铺都没有,但是 等到最后就有很多票,这些使本已稀缺的资源更加紧张。
4. 结论:淘宝的网站优化技术大多不适用于12306网站淘宝的网站优化技术中采用了大量的缓存技术和分布式策略,火车票的状态是实时计算/实时更新的/缓存只能解决网站刖端的一小部分冋题‘但解/夬不了人们抢票和出票幔的根本问题症韓个履乂伤心时我可臥数敎操咛eAJIONG。