文/王君妍
如今Web 已成为网络应用的主流形式,而部分小型的网站如校园内常见的选课系统等,会偶尔出现高并发的情况[1]。大量用户短时间内同时访问网站服务器,后端程序或数据库由于压力过大、硬件资源有限等原因响应慢,服务器响应时间极大增加,从而形成恶性循环,甚至导致服务崩溃[2]。
目前,常见的解决方案有使用缓存技术方案、使用Nginx 自带的限速方案、增加网站服务器数量并进行负载均衡方案等。各方案原理及缺点如下所述:
使用缓存技术加快网站服务器的响应速度,其工作原理是将常用数据存储到内存中,以减少硬盘I/O 次数,从而加快数据读取速度[3]。该方法一般用于读取数据的请求占比较大的场景,但是类似于选课的业务,写入请求占比较大,缓存基本不适用,且该方法需要进行后端业务系统改造,与具体业务耦合度较高。
Nginx 本身自带限流排队、连接数限制、请求速率限制以及对单个IP 地址进行限速的功能[4]。但是这些功能适用于防止恶意流量、恶意用户的情况,在选课等场景下,用户的请求具有连续性,如果采用此类限制方法,将会导致用户无法完整地完成操作。
增加网站服务器数量并进行负载均衡,其工作原理是增加网站服务器的数量,通常借助反向代理服务器来提供横向扩展,使多台服务器共同分担网络请求[5]。本文针对的场景是小型Web 应用系统如选课系统,通常其本身并不具备负载均衡的能力,改造的代价会相对较大[6]。
综上所述,现有解决方案存在需要进行后端系统改造、与具体业务耦合程度高、成本高等问题。
为解决上述问题,本文提出一种基于反向代理的针对小型短时高并发网站的并发控制方法,基于反向代理对用户会话进行排队,通过当前用户会话队列长度和网站服务器的平均响应时间,动态调整处理队列的大小,决定输出的用户会话数,使后端网站的平均响应时间最小。此方法无需对后端网站服务器进行改造,无需额外增加成本,规模小、易用性强,对于本文偶发性短时高并发的小型Web 应用场景更为适用。
本文最后将这种方法在仿真的网络环境中进行测试,测试结果表明该方法可以提升整体访问速度。
问题描述
在如高校选课等典型的场景下,大量用户几乎同时访问网站服务器,给网站服务器带来难以负荷的巨大压力,而后端系统往往硬件资源有限、性能较差,造成网站服务器响应时间极大增加,严重时甚至会崩溃、宕机。
网站服务器在处理用户请求的过程中通常会调用系统处理器、内存、磁盘、网络等资源,而硬件资源是有限的。少量用户在使用时,服务器的硬件资源足够,可以快速处理请求;适量用户使用时,服务器保持快速响应的同时网站吞吐量达到高峰;当有大量用户并发时,网站服务器处理的过程中会发生对硬件资源的冲突抢占,导致网站服务器的响应变慢,吞吐量降低。为分析此情况,本文构造了一个可表达在请求总量确定的前提下网站服务器的总处理时间和并发请求数之间关系的模型。
设完成所有请求的总时间为T。设总请求数为Q。设单位时间内完成的请求数为S。则有:
设λ 为用户的请求速率,则根据服务器处理能力随用户请求速率变化可知S为以λ 为变量的函数。由前文的分析可知,存在λ=λ0,使S 最大。下面分别讨论λ<λ0和λ>λ0时的变化规律。
当λ<λ0时,相对于服务器的处理能力,此时用户请求速率较小,因此服务器单位时间内处理用户请求数仅与单位时间内到达服务器的请求数一致,即
综合式(2)和式(3),得S 随λ的变化关系为:
综上所述,T 随λ 的变化关系为:
为了形象地观察T随λ的变化趋势,不妨取Q=50000,λ=10,k=1.2,则根据式(5)绘制T 的图像如图1 所示。
图1 Τ 随λ 的变化图
由图1 可知,服务器完成所有请求的总时间T 在用户请求速率为λ0时最小。根据这一模型,若要解决短时高并发场景下网站服务器遇到的问题,可采取排队的机制限制并发请求,将到达网站服务器的用户请求速率控制在λ0附近。
并发控制方法
本文研究一种基于反向代理的针对短时高并发网站的并发控制方法,在反向代理服务器上对用户请求进行排队,使得用户可以有序、平稳地访问网站服务器。此方法的原理示意图如图2 所示。
图2 方法原理示意图
但是排队机制的不同会影响每个用户的平均逗留时间。为使用户的平均逗留时间最短,本文以典型的高校选课场景为例构造了关于最小化用户平均逗留时间的模型。
设选课开始时并发的总人数为m,每人的连续请求数为n,每个请求的平均处理时间为u,网站服务器同时处理k个请求,完成所有请求的总时间为T,则有:
设完成前i 个用户所有请求的时间为Ti,所有用户的平均逗留时间为Ts,则
因选课业务是连续的,当第i 个用户的所有请求完成时,其前面的i-1 个用户及第i 个用户的所有请求均已完成,且第i个用户后面的用户有可能有请求已完成,则有
所以
所以
图3 理想情况下用户请求处理的示意
根据上述结论,本文选择对用户会话进行排队,并建立“处理池”。对先来的用户将其用户会话ID 记录在处理池中,标记为当前具有高优先级的用户。高优先级用户服务结束后经过一定的超时时间将从处理池中删除,下一批用户则可以开始服务。通过处理池的机制,可以实现将用户按顺序处理,以使得所有用户的平均逗留时间尽可能短。
综上所述,此并发控制方法的设计思路是为了使网站服务器同时接受的请求数在其性能可承受的范围内,即将到达网站服务器的用户请求速率控制在λ0附近,设计实现一种基于反向代理的针对短时高并发的小型Web 应用系统的并发控制方法。在用户与网站服务器之间利用反向代理服务器作为缓冲节点,并在其上对用户会话进行排队,通过处理池的方式优先处理已经在处理的用户的请求,并通过队列长度及网站服务器的平均响应时间动态调节处理池的大小,以调控直接到达网站服务器的用户请求数,使到达网站服务器的用户请求速率控制在λ0附近,且使得用户平均逗留时间尽可能短。
图4 系统架构
反向代理系统架构
本文所提出的针对短时高并发的小型Web 应用系统的并发控制方法其系统整体架构如图4 所示,包括响应时间统计模块、反馈调节模块以及排队模块。
首先,响应时间统计模块周期性地采集后端网站服务器对每个用户的每个请求的响应时间,并计算单位时间内网站服务器的平均响应时间;然后,反馈调节模块根据排队模块中正在排队用户会话的队列长度和网站服务器的平均响应时间动态调整处理池的大小,确定排队模块的排队策略;进而,排队模块根据当前处理池的大小确定系统输出的用户会话数,使后端网站服务器的平均响应时间稳定在用户可接受的范围内,实现在尽可能多的用户接受服务的同时,网站服务器可平稳地度过流量高峰。
图5 排队模块流程
1.响应时间统计模块
响应时间统计模块主要负责采集每个用户的每个请求的响应时间,通过一段时间内采集到的响应时间求出这段时间内用户的平均响应时间,并将其提供给反馈调节模块作为调节用户会话数的依据。
2.排队模块
排队模块的流程如图5 所示。
排队模块主要负责决定一个用户的请求应该被正常地转发到网站服务器还是进行排队。排队模块以用户的网站session 以及用户的源IP 地址作为唯一确定用户的用户会话ID,并以此为索引对用户会话进行排队或放行。位于排队队列中的用户会话ID 对应的HTTP 请求报文在通过排队模块时将被拒绝转发到网站服务器,并进行排队,位于处理池中的用户会话ID 相对应的HTTP 请求报文将被转发到网站服务器。
3.反馈调节模块
反馈调节模块的流程如图6 所示。
反馈调节模块通过读取排队模块中的队列长度以及响应时间统计模块计算出的平均响应时间,来对排队模块中的处理池大小进行调节,并以此控制到达网站服务器用户会话的数量。
图6 反馈调节模块流程
反馈调节模块首先通过队列长度是否为0,即当前是否有用户在排队来判断当前是否为用户流量高峰、网站服务器是否可能出现拥塞状况。在用户较少的时期,发往网站服务器的请求数较少,因而在反向代理服务器中不会出现排队的情况,此时队列长度为0。当访问网站服务器的用户逐渐增多,排队模块中处理池的大小逐渐无法容纳急剧增加的用户会话ID 数,多余的用户被转入排队队列中进行排队。因此当反馈调节模块检测到队列长度不为0 时,将增大排队模块中处理池的长度,使得网站服务器既能够满足尽可能多用户的访问,又可以将平均响应时间控制在合理的范围内。当用户流量高峰结束后,访问网站服务器的用户会话逐渐减少,处理池内用户会话ID 数逐渐回落到闲时水平,反馈调节模块根据系统中设定的空闲等待时间,将处理池的大小调整为初始状态。
为验证本方案的可行性和处理效果,本文设计了一个仿真实验,其结构图如图7 所示。
实验分为三个部分:测试端、反向代理系统、模拟网站后端。测试端为模拟若干个用户同时访问网站服务器的行为,向模拟网站后端短时间内发起大量访问请求,经由反向代理系统过滤,到达模拟网站后端。使用了一台服务器部署反向代理系统。模拟网站后端使用一个可以随着用户并发请求数的增多而响应时间越来越长的程序来模拟,并部署到一台服务器上。
图7 仿真实验示意图
为了证明反向代理系统对提升网站服务器效率的有效性,设计了不同请求数同时访问网站服务器的模拟实验,即令测试端同时向模拟网站后端发出x 个请求,通过比较经过反向代理进行排队(实验组)和未经过反向代理直接访问(对照组)完成相同数量的请求Q 所需的总时间y 来表明反向代理系统对提升网站服务器的效率是有效的,并通过比较用户平均逗留时间来表明按用户会话排队的机制优于直接排队。其中,测试端并发请求数x={10,20,30,30L 500},即初值为10、公差为10、最大值为500 的等差数列,总请求数Q=3000,另外设置反向代理系统处理池的初值A0=2,处理池大小的更新频率为h=5s。
下面进行两组实验。
实验一
分别进行经过反向代理系统进行排队(实验组)的压力实验和未经过反向代理系统直接访问(对照组)的压力实验。
图8 为上述实验的结果。图中横坐标为测试端的并发请求数χ,纵坐标为完成所有3000 个请求所用的总时长y,单位为秒,折线上的每一个点即表示该并发请求数下完成所有请求所用的总时长。图中的两条折线分别代表测试端未经过反向代理系统对模拟网站后端进行直接访问(对照组)和经过反向代理系统进行排队(实验组)时的实验结果。
图8 完成所有请求所需时间对比图
比较图中的两条曲线,可以看出在并发请求数较小的时候,不经过反向代理系统直接访问模拟网站后端完成所有请求所用的时间较短、效率较高,但是随着用户并发量χ 的增加,不经过反向代理系统的模拟网站后端完成所有请求所用的时间迅速上升,而经过反向代理系统的模拟网站后端完成所有请求所用的时间稳定在一定范围内。
仿真实验一的结果证明本方法能通过减少后端压力,有效的提升后端响应速度,来实现服务器效率的提升,符合预期效果。
实验二
实验二对比用户平均逗留时间,分别进行按用户会话排队(实验组)的压力实验和直接排队(对照组)的压力实验。
图9 为用户平均逗留时间对比实验图。图中横坐标为测试端的并发请求数,纵坐标为用户平均逗留时间,每一个柱状图的高度即表示该并发请求数下用户的平均逗留时间。图中灰色的柱状代表直接排队(对照组)的实验结果,黑色的柱状代表按用户会话排队(实验组)的实验结果。实验图选取有代表性同时也是本课题高并发场景下的并发请求数为300 至500的区间。
图9 用户平均逗留时间对比实验图
比较图中的两个颜色的柱状,可以看出在并发请求数相对较小即并发请求数小于380 时,按用户会话进行排队的用户平均逗留时间略小于直接排队的用户平均逗留时间。当并发请求数在390以上时,按用户会话进行排队的用户平均逗留时间明显小于直接排队的用户平均逗留时间。并发请求数为400 至500区间时,按用户会话排队的用户平均逗留时间的平均值比直接排队的用户平均逗留时间小24%。
仿真实验二的结果证明本方法通过处理池的方式调节用户请求的处理优先级,按用户会话进行排队,可以使得用户的平均逗留时间降低,符合预期效果。
针对有偶发性高并发的小型Web应用系统如高校常见的选课系统在短时间内大量用户访问网站服务器,导致服务响应慢甚至宕机的问题,本文构造了一种基于反向代理的短时高并发网站的并发控制方法。该方法对用户会话进行排队,并通过读取网站服务器的平均响应时间,动态调整用户会话的排队策略,使得后端网站的平均响应时间最小。
仿真实验结果表明,此方法可以通过减小后端压力,有效地提升后端响应速度,以实现整体处理效率的提升,并且可以降低用户的平均逗留时间,达到预期效果。