论大型网站架构的必要因素
摘 要:在互联网和大数据的背景下,用户访问量大幅度提升,同时产生了大量的用户数据。加上后来的智能移动设备的普及,越来越多的网站、应用系统需要支撑高并发请求。本文以如何应对高并发问题为基准,根据以往自己开发的秒杀系统为例,论述大型网站架构的必要因素。
关键词:高并发;集群;设计原则;
0 引言
在传统的小型网站中,比如个人网站,可以使用最简单的html静态页面就实现了,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单。随着互联网业务的不断丰富,用户的数目的不断上升,尤其对于大型网站来说,面对百万甚至更多的并发请求,如何保证系统能应对高并发的情况尤为重要。
1 互联网三高
1.1高并发
高并发是互联网分布式系统架构设计中必须考虑的因素之一。当多个进程或线程同时(或着说在同一段时间内)访问同一资源时会产生并发问题,因此需要通过专门的设计来保证系统能够同时正确处理多个请求。淘宝的双十一、春运时的抢票等。除了这些典型事情,每秒几十万请求的秒杀系统、每天千万级的订单系统、每天亿级日活的信息流系统等,都是高并发的场景。
1.2高性能
而与高并发紧密相关的就是高性能。高性能就是指开发制作的网站呈现出一种程序最优化,浏览网站速度快,给用户一种反应迅速的体验。是网站的一个重要指标,也是网站架构设计的一个重要方面。衡量性能一系列指标,如:响应时间、TPS、系统性能计数器等,通过测试这些指标可以确定系统设计是否达到目标,分析瓶颈,预测网站容量,并对异常指标进行报警,保障系统可用性。
1.3高可用
高可用也是网站架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。百度的搜索首页,是业内公认高可用保障非常出色的系统。因此,在高并发的情况下,保证系统服务器能够不宕机,持续提供正常服务是必须的。
2 设计原则
第一个原则是不要有单点。单点往往是系统高可用最大的风险和敌人,意味着没有备份,风险不可控。应该尽量在系统设计的过程中避免单点。避免单点的措施就是进行分布式部署。将提供服务分布在多台服务器中,当其中一台服务器硬件出现问题甚至宕机的时候,另一服务器可以继续对外提供服务。这时,在外部看来系统整体依然是可用的,这就给恢复那台故障服务器提供了时间。而两台服务器同时出现硬件故障的概率是很低的。在高并发的情况下,机器由于承受压力的原因,宕机的概率也随之上升,多个备份服务器是必不可少的。
第二个原则是请求数要尽量少。用户请求的页面返回后,浏览器渲染这个页面还要包含其他的额外请求,比如说,这个页面依赖的 CSS/JavaScript、图片,以及 Ajax 请求等等都定义为“额外请求”,这些额外请求应该尽量少。因为浏览器每发出一个请求都多少会有一些消耗,例如建立连接要做三次握手,有的时候有页面依赖或者连接数限制。另外,如果不同请求的域名不一样的话,还涉及这些域名的 DNS 解析,可能会耗时更久。所以减少请求数可以显著减少以上这些因素导致的资源消耗。例如,减少请求数最常用的一个实践就是合并 CSS 和 JavaScript 文件,动态的把多个 JavaScript 文件合并成一个文件一起返回。
第三个原则是依赖要尽量少。依赖主要指的是要完成一次用户请求必须依赖的系统或者服务。在面对高并发的请求时,有些次要的或无关的信息可以去除掉,在秒杀系统中,用户进行商品的秒杀,如优惠券、成交列表等这些对秒杀可有可无的信息就可以去除。只需要必要的信息,来保证服务的完整。还有类似如页面的渲染,JS和CSS等,都可以减少等。
3 解决方案
在现实生活中,秒杀是一个很常见的场景,如在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。从中就带来了这几个问题:高并发访问;数据的一致性;系统的高可用性等。传统流程如图1。
图1
针对主要的秒杀流程,在一瞬间会有大量用户的秒杀请求,做出系统的优化。首先进行负载均衡,采用nginx将大量的请求分散转发到多个服务器中,避免对一个服务器的压力过大。然后要限制大部分流量,只允许少部分流量进入服务后端。可以在前端限制用户点击请求数,在请求成功后不能再次发起等。
对于到达服务器的请求,采用Redis 做缓存服务器,使用最简单的key-value数据结构,存储部分有关业务的数据。避免了请求直接到数据库,有效降低数据库崩溃的概率。
面对每个用户的请求,为了保证公平性,即请求的先后问题,使用如rabbitmq的消息队列中间件,作为请求队列,依次插入请求,进行排队处理。当插入的请求数达到上限时,停止所有后续插入。然后系统使用队列将排队的请求依次处理。流程如图2.
图2
在处理类似于秒杀业务时,使用一些事务技术或锁等,使系统在执行的过程中,不会被其他客户端发送来的命令请求所打断,保证了不发生超卖情况。用户在请求页面时,针对高频率访问的页面,使用页面静态化方案,将访问评率高的页面DOM结构存储如Redis数据库中,数据存储在缓存中。当有用户请求高频页面时,再动态的查询缓存数据,进行页面的动态渲染,最终返回页面给用户,大大降低了数据库和服务器的压力。在进行系统部署时,采用集群架构如k8s,将服务部署在集群上,避免单点服务,确保最终系统的高可用和容错性。
4 结语
本文介绍了有关互联网三高的概念特点等方面,并根据实际的业务场景,设计具体的大型网站设计原则,分析了高并发情况下,应该如何解决问题,给出具体解决方案。在设计大型网站时,应具体问题具体分析,通过业务流程,分析系统流程步骤,从请求限流,分流,使用缓存等方案中进行选择和优化。希望本文的介绍能对读者有所启发。