基于B/S的网上考试系统高并发性能优化研究与应用
2015-07-17徐晓鹤山东钢铁股份有限公司莱芜分公司自动化部山东莱芜271104
徐晓鹤(山东钢铁股份有限公司莱芜分公司自动化部,山东 莱芜 271104)
基于B/S的网上考试系统高并发性能优化研究与应用
徐晓鹤
(山东钢铁股份有限公司莱芜分公司自动化部,山东 莱芜 271104)
摘 要:网上考试系统随着网络信息技术的发展不断得到推广应用。随着应用对象、考试规模的不断扩大,高并发高数据量成为网上考试系统性能提升的瓶颈。该文结合莱钢网上考试系统的系统设计与应用实践,分析了系统在高并发应用条件下的瓶颈,并给出了解决方案。
关键词:network exam;high—concurrency;研究应
0 引言
网上考试是延伸了传统考试考场的涵义,它利用网络的无限广阔空间,把考场从学校延伸到了家中、计算机房、办公室及其它任何网络所覆盖的区域,并可随时对考生进行考试,加上数据库技术的利用,使考试变得更公平公正、更具权威性和可靠性。与传统考试方式相比,计算机网络考试可以突破地域限制、实现自动控制、自动阅卷评分等特性,大大节约人力、财务、物力。由丁B/S模式具有客户端无需配置、开发效率高、易于管理和维护等特点,基于B/S模式的网络考试系统正在逐渐成为主流应用。但每个客户端用户的访问,都会占用服务器一定的资源。因此,在硬件设备和软件算法复杂度不变的情况下,每台应用服务器一般都存在一个最高用户并发数,一旦并发访问的用户数量超过这个数量,就会引起系统性能急剧下降,甚至出现用户访问无响应等服务器拒绝服务的情况。
莱钢网上考试系统主要用于业务技能竞赛.需要保持各参赛人员试卷内容一致,试题随机排序,下载、上传必要的附列资料文档,一般同时参加考试人数在六千人左右,甚至多达上万人,经常出现并发访问和提交大量数据,因此,如何优化网上考试系统设计策略,提升服务器性能,使之能满足高并发大数据量的应用,是必须解决的问题。
1 接入层负载均衡
根据网络七层协议定义,在服务器端,可以在传输层或应用层对系统的介入层进行负载均衡考虑。考试系统为B/S架构,目前使用基于应用层HTTP协议的负载均衡技术较为成熟,且应用广泛,使用既有的开源技术即可达到接入层的网络负载均衡的目的。虽然在越底层做负载均衡效率越高,资源利用率越小,但是基于传输层TCP协议的LVS(Linux Virtual Server)维护难度较大,因此在应用层做负载均衡是最佳选择,在本系统中LVS作为辅助方案。
NGINX是开源的基于HTTP的反向代理,除了具有HTTP包转发的功能外,还能通过配置实现HTTP协议的负载均衡。在服务器上部署多套考试系统Server端程序后,在NGINX的配置文件nginx. conf中,添加负载均衡配置项,并根据各自服务器的性能及部署情况设置各自的权重,即可达到按需负载均衡的目的。
下面的配置表示,每6个对考试系统的HTTP请求中,3个请求会被转发到10.10.10.110服务器,2个被转发到10.10.10.111服务器,1个被转发到10.10.10.112服务器。
upstream exameServer { server 10.10.10.110:8080 weight=3; server 10.10.10.111:8080 weight=2; server 10.10.10.112:8080; }
2 核心业务和非核心业务分离
考试系统的核心业务为考试功能,除此外还包含了非核心业务如试卷生成、评分、查分、统计、通告等。一般情况下,考试功能是考试系统的核心,保证考试功能不被其他非核心业务的影响至关重要。系统需要将考试功能独立成为单独的进程,防止非核心业务功能因宕机、资源利用率过高等造成对考试的影响。
3 根据题型划分服务端程序
一次考试试卷中,往往有多种题型,题型不同,用户在WEB界面上停留的时间长短不同,对后端产生的数据读写请求数也不相同。以选择题和问答题为例,用户在选择题上停留的时间一般较短,短时间内产生的数据读写请求较多,单条数据的数据长度较小;但用户在问答题上停留的时间一般会较长,产生的数据读写请求较少,但是单条数据的数据长度往往较大。
因此,可以根据题型的不同,将读写频繁的页面和读写较少的页面独立成不同的应用,并合理分配两者之间的比例,将有利于提高对服务器资源的利用。根据统计用户在选择题上的平均停留时间为1分钟,在问答题伤的平均时间为5分钟,那么相对更多地部署选择题对应的服务器端应用。在较大的并发读写请求情况下,将其进程部署个数分配为5:1将是比较合理的选择。
4 数据库读写分离
考试系统的数据持久化层使用了数据库作为存储工具,多并发读写数据库的情况下,锁操作频繁将导致系统花费大量时间在数据库的读写上。因此,对数据库进行读写分离将显得尤为重要。
考试系统读写分离后,对数据的写操作如考试功能作用于主库,对数据的读操作如查分功能作用于备库。若单个备库不能满足查询业务需求时,可建立多个备库,并根据业务量合理分配备库的使用程序。
4.1 数据库分库分表
考试系统的核心数据分为题库和用户考题数据,题库用于记录考题元数据,用户考题数据用于记录用户的考试题目、用户考试答案,以及考试时间等信息。题库一般数据条数不多,使用单表即可满足日常应用。但是用户考试记录随着年限的增长,当达到百万级别的时候,读写性能将明显降低。根据需要,为每一个库(也可以到表级别)设置一套数据文件(元数据文件、索引文件和数据文件),不同数据库的文件又放置在不同的磁盘中,将大大提高磁盘的读写效率。
4.2 为考试设计的分库分表
考试过程中的数据读写并发量,主要是用户对自己的考试数据的读写与更新,可以按照用户维度,进行分库分表。在实际运行中发现,单库单表只能支撑p人的同时考试,那么为了满足t人同时考试,可以建立m个库n张表,其中t <= m*n*p。在用户考试时,根据用户的登录名称或内部号码等Hash到这m*n个库表中,从而让这些库表共同分担了t个人考试的读写请求。
作者简介:徐晓鹤(1983-),男,山东济南人,本科,工程师,研究方向:工业自动化控制软件工程。