技术专家支招12306.cn性能优化
admin 13年前
<p> 每年春运都是一件牵动人心的大事,电子商务大势所趋,今年春运我们终于迎来了传统购票方式之外的另一个选择——<a href="/misc/goto?guid=4958326436535693500">12306. cn</a>。不过这个新选择并没有让大家的回家之路变得顺畅多少,只是把一部分人的“战场”从寒风中或者电话旁换到了互联网上,各种工具、插件齐上阵,只为买到一张票,网友将它戏称为“中国最牛电商”、“电商严冬中的一朵奇葩”。</p> <p> 我们相信铁道部原本是想让 12306.cn 为大家服务的,不过就目前该网站的表现来看,实在是差强人意。铁路购票系统的细节我们不得而知,笔者也不清楚那<a href="/misc/goto?guid=4958326437333265691">非常特别的“海量事务高速处理系统”</a>究竟为何物,但相信该系统在某些地方还是有别于大家所熟知的互联网系统的。针对铁路购票网站无法应对购票客流的话题,在微博和博客中引发了热烈的讨论,众多网友纷纷出谋划策,提出了很多优化的建议。</p> <p> 游戏技术专家<a href="/misc/goto?guid=4958326438133133004">云风</a>早些时候发表了博文<a href="/misc/goto?guid=4958326438927724235">《铁路订票系统的简单设计》</a>,其中提出了一种基于排队系统的设计方案,排队是网游中比较常用的一种手段,这里将购票网站比作购票窗口,需要购票的用户必须先排队,最后排到的用户才能进行实际的购票操作。藉此提升站点稳定性,避免大量社会资源浪费在无效的网络购票流程上。在文章最后,云风认为:</p> <blockquote> 因为铁路购票系统很多年前就实现了内部网络化,有成熟系统支撑,运作多年。这次做互联网版本,一定不能放弃原有系统新来一套。[..]所以要做的仅仅是怎么做一个系统和原有系统对接。 </blockquote> <p> 4399首席架构师<a href="/misc/goto?guid=4958326439728102925">曹政</a>也撰写了一篇<a href="/misc/goto?guid=4958326440527599554">《铁路订票网站个人的设计浅见》</a>,他将网站的主要需求分为三部分,即车次查询与余票显示、用户注册与登录,以及下单。文中以缓存为切入点,提出了一些建议:</p> <ul> <li>针对查询,存储结构 KV 化,推荐 Redis 之类的 NoSQL 存储</li> <li>车次及车票余量的查询结果要缓存化、静态化</li> <li>应对 10 亿级别的请求,<a href="/misc/goto?guid=4958326441338236317">在前端也需要做缓存处理</a></li> <li>I/O优化</li> </ul> <p> 缓存化、静态化并不是不做动态更新,总之,目标就是让绝大多数的请求都落到缓存中,降低后端服务器的压力,让它们能有更多的资源处理真正的购票请求。</p> <p> 知名博客<a href="/misc/goto?guid=4958185560036269721">酷壳</a>作者、亚马逊中国技术经理<a href="/misc/goto?guid=4958185590815146876">陈皓</a>从 12306.cn 的性能问题入手,<a href="/misc/goto?guid=4958325832157320866">介绍了一些常用的性能优化技术</a>。虽然其中的一些东西受到了<a href="/misc/goto?guid=4958326444352721471">质疑</a>,不过全文还是能让读者了解到性能优化的诸多内容。首先,从业务上分析了 12306.cn 与 QQ、网游、秒杀、奥运票务系统的区别,认为它和电子商务的订单系统比较相似,而且铁路票务中的突然放票做法非常恐怖。随后,分前端和后端两部分展开详细说明。</p> <p> 前端优化技术常用的有:</p> <ul> <li>前端负载均衡,通过 CDN 及 DNS 负载均衡器分散压力</li> <li>减少前端链接数,例如可以合并 CSS、JS 和图标文件</li> <li>减少网页大小增加带宽</li> <li>前端页面静态化</li> <li>优化查询,可以考虑使用 NoSQL 技术</li> <li>缓存动态页面和查询数据</li> </ul> <p> 后端优化技术主要是:</p> <ul> <li>数据冗余</li> <li>数据镜像,可提高可用性,便于负载均衡</li> <li>数据分区,比如按照火车票的信息分区存放数据</li> <li>后端系统负载均衡,建议由下游的计算服务器去任务服务器上拿任务</li> <li>异步和批量处理,比如可以使用队列进行排队</li> <li>限流,这是系统的一种自我保护手段</li> </ul> <p> 关于云风提出的排队方法,陈皓也做了一些补充,例如,如何防范攻击,队列的一致性和等待时间等等。陈皓强调</p> <blockquote> 无论你怎么设计,你的系统一定要能容易地水平扩展。 <p>上述的技术不是一朝一夕能搞定的,没有长期的积累,基本无望。</p> </blockquote> <p> 上面的一些讨论都是围绕技术展开的,在 Google+ 上,<a href="/misc/goto?guid=4958326445163140464">霍矩</a>、云风和刘新生(o6z)的<a href="/misc/goto?guid=4958326445949323857">讨论</a>同样精彩,o6z 指出仅从技术入手无法解决根本的问题:</p> <blockquote> 做这些项目不是应该先设计,而是应该先业务,特别是应该先了解清楚他们现在的系统构件情况。[..]这不仅仅是 Web 的问题,而是要先从业务下手。[..]构架师不是一个技术角色,做的不是技术决策,而是业务和商业决策。 </blockquote> <p> 除此之外,还有一些文章也值得一读,例如这篇<a href="/misc/goto?guid=4958326446757069214">《建设一个靠谱的火车票网上订购系统》</a>。不知读者您又有何想法?值此新春佳节之际,希望每位读者都能顺利买到车票,与家人共度新春。来自: <a id="link_source2" href="/misc/goto?guid=4958326447551600420" target="_blank">InfoQ</a></p>