【IT168 评论】2012年春节前夕,火车票可以在网上购买的消息让人们激动不已,原本以为再不用半夜起来、忍冻排队,但是很快骂声不绝于耳,光是登录过程就要耗去半小时甚至更长,更别提购票了。不完全统计,7天内,12306网站访问用户已占全球互联网用户的0.902%,每天点击量高达10亿人次;系统一度支撑不住如此庞大的访问量而陷入崩溃。
面子工程?设备有问题?架构不好?质疑声不断,为此IT168特意采访了《互联网运营智慧》的作者田逸,请他跟我们一起聊聊12306购票网站及高频高并发网站背后的故事。
您认为12306订票网站存在哪些需求特点和挑战?
从12306表现的情况来看,可以说是严重缺乏可用性,而所谓的日均PV达到10亿,也是由于用户不停的访问,不停的刷新,所累积出来的,实际的用户数量远小于这个数。我们知道对于互联网来说,一般都是读大于写,也就是说主要操作还是查询,比如12306,可能很多人都在查同一张票,比如北京到广州,时间、车次这些基本都是一致的,而且由于不能选择座位,变化的只是座位数量,因此对于时间、车次这些信息查询一次就可以了,完全可以把这些缓存起来,这样下一个人访问的时候就可以直接从缓存调取,这样一来访问速度会大大提高,同一方向的人访问量自然就会下降,计算到互联网上,这个数目就比较大了。
另外,从技术的角度看,北京到哪里,区段是固定的,而且买票主要是集中到某几个区段,可在数据库里使用分区技术,不同的分区写不同的区间的车次,这样数据量也会少很多,从而提高网站的可用性。
国内的大型网站还包括淘宝、京东、新浪等,您认为12306的访问模式和淘宝、京东存在哪些异同?
12306和淘宝、京东访问模式基本都差不多,都是查询,交互,下订单等;不同的是淘宝、新浪都是一点点积累,12306并没有这个积累过程,而且这个过程中也没有过多考虑用户体验,可用性、可靠性等。从表现出来的情况看,12306购票的过程中有很多队列,如登录队列,查询队列等等,在这里,我们完全可以采取另一种方式,比如在网上公示哪个地方的票没有了,这样就会少很多人去查询,而且并不需要全部公示,仅仅公示最热门的一些车次就可以了。另外也可采用分地域的方式,比如上海局可以独立一个、北京局独立一个,这个压力就会减很多,因为如果人在上海,基本就是从上海出发,而不会买北京发车的票,这样就可以实现本地访问,从而减少很多压力。
淘宝在其光棍节促销期间,TMall也曾经遭遇宕机事件,京东也曾经遭遇宕机事件,您认为这些宕机事件和12306网站崩溃有何异同?
淘宝光棍节CDN达到800GB左右,双12更是达到900GB,但是由于淘宝系统架构很好,另外,运维人员这么多年的积累,经验丰富,所以很少宕机,而京东则属于架构有问题,淘宝和京东一个以技术为驱动,一个是以商业为驱动,淘宝是把技术做好了顺便卖点东西,京东是卖卖东西顺便把技术搞一搞,而12306又不大相同,属于政绩工程,先弄出来,至于好不好用不知道,没法评估,因为并不开放。
您认为目前的12306订票网站在哪些方面可能存在问题?
基于目前的架构,带宽从400MB增到1500MB基本无作用,就像车跑不快,换个轮子也无济于事,其它方面也比较类似,比如运用的全网CDN加速。我们看到12306网站做得很简陋,基本没有图片,数据都是动态的,这样每个步骤都是操作数据库,都是在用CDN,不仅浪费钱,而且用户体验也不好。
一个整体的架构并不是各个部分的堆砌,得在架构上做优化,用户体验上下功夫,这其中就可以大量使用缓存技术,比如把查询缓存起来,这样访问速度就会加快,流量就大了,比如高速公路上,四条车道,如果设置收费站,而且收费也慢,可以计算1小时能通多少车,假如没有收费站,能通多少车,不言而喻,其实跟12306的道理一样,乘客买到票就走了,查到没有票也就走了,就不会出现无限刷页面的情况了。
高并发网站架设应该注意些什么
一个大型的高并发高性能网站架构需要从哪些层面去考虑?要实现高并发,可以从哪些技术手段入手?您个人有哪些比较好的建议?
如今,百万千万PV已经算不上高并发网站,这其中设备、技术、各应用之间的逻辑关系都得仔细考虑,而技术又包括操作系统Windows,Java,缓存,应用程序,数据库,分布式技术,负载均衡技术等等。
其实一个高频高并发网站的架构可以想象成一个漏斗,口大,越往下漏越小,前端Webserver不停的、大量的接收请求,然后通过合理运用负载均衡、CDN缓存、数据库缓存一层层过滤,最终到达数据库的量也在控制范围内了。
下面是技术上一下几点建议:1.前端的负载均衡技术,2.CDN的缓存技术应用,第一个人访问过,第二个人就可以直接访问了,而且就近访问,这样不仅访问速度快,而且成本也会降低,3.采用分布式系统,再强大的设备都是有系统极限的,而分布式系统是可以扩展的,比如像游戏后台服务器,一台服务器可以支撑2000用户,那么加一个处理器也许只能加100-200,然而加一台服务器就可以增加2000用户,另外,数据库服务器也使用多台,互联网都是读的多,读的时候从多个数据库服务器读,这样速度就快了,写的时候只有一个数据库写,这样就保证数据一致性,另外数据库也可以采用缓存技术,除此数据库本身分区技术等等这些都可以提高可用性。
如果流量再大,可以考虑拆分,比如一个门户网站有很多频道,在量一定的时候可以放在一起,当其中某一个频道流量特别大的时候,就可以把其中一个拆出来,给这个频道单独做一个环境,前端根本看不出变化,但后端其实已经不再那个服务器里了。
部署大型的高并发高性能网站架构需要注意哪些问题?存在哪些挑战?
像12306,春节时间买票特别多,人力各方面都要准备特别多的资源,然而这些资源平时怎么办呢,怎么平衡,这个就需要好好思考了,目前还不好办,像淘宝可以不停的搞活动,12306不可以,平时坐火车的就那么多人,所以这个问题上就要考虑投入产出比,目前还没有太好的办法解决。
很多网友提到了用开源的技术来构架大型高并发网站架构,开源技术在这个领域是否存在一些优势?
完全可以考虑使用开源技术,大部分互联网公司都是开源,其实开源不仅仅是技术本身,更重要的是一种思想,大家愿意去交流,优势,省钱是一方面,另外出了问题,甚至可以给作者写信有人去帮你解决。而用商业软件的公司都比较封闭,出了问题也不愿意沟通,以致大家都在猜测,
有人建议使用云计算平台(类似于Amazon之类的)来搭建这类网站,以便提高资源利用率节省成本,您是如何看待的?
采用云服务商提供的服务,量大了其实并不划算,因为带宽,cpu等等都要计费,利用率提高了,成本不一定节省,而且不可控,对于创业型的小公司倒是可以考虑采用云计算平台,不过对于12306自己建一个云环境倒是有可能的。
有网友建议采用Hadoop、NoSQL等技术去解决此类问题,但也有反对者称NoSQL技术不是很成熟,并且在实现数据一致性方面存在问题,您如何看待?
其实都可以用,但是要根据不同的应用环境合理的应用,Hadoop主要用作数据分析,搜索引擎,在分析用户行为上可以考虑。NoSQL是简化的SQL,用来做缓存技术的,但要和SQL一起使用,目前发展也很成熟了,并不存在数据库一致性方面的问题。
您认为虚拟化(不局限于服务器虚拟化,也可以包括网络虚拟化等)在这类型大型高并发网站建设过程中可以起到什么作用?
肯定是起作用的,但并不是说所有的应用都适合虚拟化,例如IO密集型,计算密集型的就不能虚拟化,但像前端WebServer就可以采用虚拟化,因为它本身就是用来接收请求的,虚拟化后可以大量增加接收请求的数量,而数据库服务器就不能虚拟化,因为本身运算量大,而且对磁盘读写需求量大,虚拟化后可用性会大大降低。