InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

技术专家支招12306.cn性能优化

作者 丁雪丰 发布于 2012年1月20日

领域
架构 & 设计,
语言 & 开发
主题
NoSQL ,
性能评估 ,
性能调优 ,
数据库 ,
设计 ,
架构 ,
性能和扩展性 ,
性能和可伸缩性 ,
Redis ,
可用性 ,
优化

每年春运都是一件牵动人心的大事,电子商务大势所趋,今年春运我们终于迎来了传统购票方式之外的另一个选择——12306.cn。不过这个新选择并没有让大家的回家之路变得顺畅多少,只是把一部分人的“战场”从寒风中或者电话旁换到了互联网上,各种工具、插件齐上阵,只为买到一张票,网友将它戏称为“中国最牛电商”、“电商严冬中的一朵奇葩”。

我们相信铁道部原本是想让12306.cn为大家服务的,不过就目前该网站的表现来看,实在是差强人意。铁路购票系统的细节我们不得而知,笔者也不清楚那非常特别的“海量事务高速处理系统”究竟为何物,但相信该系统在某些地方还是有别于大家所熟知的互联网系统的。针对铁路购票网站无法应对购票客流的话题,在微博和博客中引发了热烈的讨论,众多网友纷纷出谋划策,提出了很多优化的建议。

游戏技术专家云风早些时候发表了博文《铁路订票系统的简单设计》,其中提出了一种基于排队系统的设计方案,排队是网游中比较常用的一种手段,这里将购票网站比作购票窗口,需要购票的用户必须先排队,最后排到的用户才能进行实际的购票操作。藉此提升站点稳定性,避免大量社会资源浪费在无效的网络购票流程上。在文章最后,云风认为:

因为铁路购票系统很多年前就实现了内部网络化,有成熟系统支撑,运作多年。这次做互联网版本,一定不能放弃原有系统新来一套。[..]所以要做的仅仅是怎么做一个系统和原有系统对接。

4399首席架构师曹政也撰写了一篇《铁路订票网站个人的设计浅见》,他将网站的主要需求分为三部分,即车次查询与余票显示、用户注册与登录,以及下单。文中以缓存为切入点,提出了一些建议:

  • 针对查询,存储结构KV化,推荐Redis之类的NoSQL存储
  • 车次及车票余量的查询结果要缓存化、静态化
  • 应对10亿级别的请求,在前端也需要做缓存处理
  • I/O优化

缓存化、静态化并不是不做动态更新,总之,目标就是让绝大多数的请求都落到缓存中,降低后端服务器的压力,让它们能有更多的资源处理真正的购票请求。

知名博客酷壳作者、亚马逊中国技术经理陈皓从12306.cn的性能问题入手,介绍了一些常用的性能优化技术。虽然其中的一些东西受到了质疑,不过全文还是能让读者了解到性能优化的诸多内容。首先,从业务上分析了12306.cn与QQ、网游、秒杀、奥运票务系统的区别,认为它和电子商务的订单系统比较相似,而且铁路票务中的突然放票做法非常恐怖。随后,分前端和后端两部分展开详细说明。

前端优化技术常用的有:

  • 前端负载均衡,通过CDN及DNS负载均衡器分散压力
  • 减少前端链接数,例如可以合并CSS、JS和图标文件
  • 减少网页大小增加带宽
  • 前端页面静态化
  • 优化查询,可以考虑使用NoSQL技术
  • 缓存动态页面和查询数据

后端优化技术主要是:

  • 数据冗余
  • 数据镜像,可提高可用性,便于负载均衡
  • 数据分区,比如按照火车票的信息分区存放数据
  • 后端系统负载均衡,建议由下游的计算服务器去任务服务器上拿任务
  • 异步和批量处理,比如可以使用队列进行排队
  • 限流,这是系统的一种自我保护手段

关于云风提出的排队方法,陈皓也做了一些补充,例如,如何防范攻击,队列的一致性和等待时间等等。陈皓强调

无论你怎么设计,你的系统一定要能容易地水平扩展。
上述的技术不是一朝一夕能搞定的,没有长期的积累,基本无望。

上面的一些讨论都是围绕技术展开的,在Google+上,霍矩、云风和刘新生(o6z)的讨论同样精彩,o6z指出仅从技术入手无法解决根本的问题:

做这些项目不是应该先设计,而是应该先业务,特别是应该先了解清楚他们现在的系统构件情况。[..]这不仅仅是Web的问题,而是要先从业务下手。[..]构架师不是一个技术角色,做的不是技术决策,而是业务和商业决策。

除此之外,还有一些文章也值得一读,例如这篇《建设一个靠谱的火车票网上订购系统》。不知读者您又有何想法?值此新春佳节之际,希望每位读者都能顺利买到车票,与家人共度新春。

丁雪丰 是InfoQ中文站编辑,满江红翻译组核心成员,出版过《Spring攻略》、《JRuby实战》等多部译著。主要关注领域:企业级应用、海量数据计算、动态语言应用等。

我不认为12306的核心问题在于技术 发表人 zhang xiaofei 发表于
Re: 我不认为12306的核心问题在于技术 发表人 黄 国华 发表于
表示无法理解 发表人 穆 晓飞 发表于
就没有人做算法分析么? 发表人 Kraft Bai 发表于
Re: 就没有人做算法分析么? 发表人 Kraft Bai 发表于
12306的主旨不是速度有多快,而是公平,就是大家都有机会抢到票 发表人 tao wu 发表于
  1. 返回顶部

    我不认为12306的核心问题在于技术

    发表人 zhang xiaofei

    所以,为免跑题不多讲。

  2. 返回顶部

    表示无法理解

    发表人 穆 晓飞

    表示无法理解铁道部在这个系统上的想法

  3. 返回顶部

    就没有人做算法分析么?

    发表人 Kraft Bai

    都是假构师 运维专家...
    数据缓存个有无就行了,到底懂不懂业务啊,这不是个简单的查询key问题,要进行计算
    ABCDEF 如果CD 被订了,
    1 A-F就没有了,只有CD订了,CD撤销,AF就又有了,但这个时候A-C,D-F还是有的,
    2 如果CD被订了, 这个时候如果有人订AB, 为了卖出最多的票,显然要从已经有区间订过的座位中选,而不是从全空中选, 而且是越适合越好。
    3 车次之间数据无关
    12306网上显然有固定的窗口数,他只是没做统一排队而已,所以有的人很快,有的人很久,不公平,云风的想法只解决个公平问题,还有资源消耗问题,嗯铁道部财大气粗,不差钱。如果网页提示你还要等半个小时,你咋办?

    其他的前端优化都是靠谱的,后端优化都是在拿着大道理在套,不知道是真明白还是假明白。当然前端是看得到的,后端只能猜。

    再者有90%的可能这个项目不是一个公司在做!!! 而且有很多历史遗留问题,那么多人搞,肯定有些明白人,但协调项目是个政治问题。

    还有个土办法,做本地查询,知道有哪些车次,不管有无票,直接按123优先级排序订票提交,如果1卖光了,选择2,然后3, 交钱,然后半个小时后发信通知买没买到。

  4. 返回顶部

    Re: 就没有人做算法分析么?

    发表人 Kraft Bai

    1 2 3 有点乱,没找到重新编辑,抱歉

  5. 返回顶部

    12306的主旨不是速度有多快,而是公平,就是大家都有机会抢到票

    发表人 tao wu

    所以嘛,都是纸上谈兵,要是真能优化到所谓靠谱的火车票网上订票网,那春运每天一秒热门线路的票就抢完了。将成为各类秒杀器的天下,呵呵!

  6. 返回顶部

    Re: 我不认为12306的核心问题在于技术

    发表人 黄 国华

    嗯,同意