## 结构规划
### 项目概况
这是一个网络答题项目,深圳某区公安分局组织了一次学生安全教育专题活动,该活动是在区电视台一个节目直播的,直播时间是星期天晚上19:00,节目时长1个小时,定于节目结束后,也就是晚上8:00开放答题。全区约有50万学生(包括幼儿园、小学、中学)。公安分局已经提前一星期在微信公众号上做了推送,并部署全区学校,通过学校要求每个学生观看,并作为家庭作业完成。也就是说,这50万学生都是要进入系统答题的,因为要完成作业嘛,况且,还会抽取前200名学生发放大礼包!
不得不说,该区公安分局在这方面做的很好,节目准备非常充分,事后看,节目效果也是非常好,称赞!
50万学生,我们设想一下,电视节目一结束,全部都会在很短时间内涌入答题网站,这是一次很高并发量的访问,可想而知,服务器是有很大压力的。
项目开发没有难度,是一个简单的答题网站,使用PHP开发,使用Redis进行数据存储、session存储、成绩计算、成绩排名,后台队列把成绩写入数据库。总之,在代码上进行了也是进行了大量优化的,不是本文主要目的,本文主要讲述的是腾讯云服务器的部署。
事实上,节目还没开始,当地电视台的网站就垮了,因为推送的网络直播地址是电视台自己的网站,没有做好这么大并发量的准备工作。后来,学生们都是通过电视看的直播。直播结束后,电视台把录播节目放在了视频网站上,又有一部分学生通过视频网站观看了节目。
这么大的并发量,如何应对?
### 结构设计
因为没有自己的硬件服务器,计划使用腾讯云完成这次搭建工作。腾讯云产品线很完善,控制台非常易于使用,功能完善,这个要给腾讯云一个赞。
![](https://box.kancloud.cn/c948ca1fc382e710d78e8dbe77b528a0_923x712.jpg)
:-: 服务器拓扑结构图
一、使用DNS轮询,将网站域名解析到多个负载均衡服务器的IP上。这样,客户端请求访问域名时,会随机的被DNS服务器分配给不同的IP地址,并且客户端会对该IP地址解析结果进行一定时间的缓存,于是,大量的客户端请求就被比较均匀的分配到了三台负载均衡主机上。
二、使用负载均衡。由于对腾讯云的负载均衡服务器性能不确定,所以不能仅依赖一台负载均衡主机,因此采用创建多台负载均衡主机的方案,以消除负载均衡主机性能瓶颈,并且,负载均衡主机会自动屏蔽故障服务器,提升整个系统的可用性。
三、使用文件存储服务保存网站程序文件。腾讯云的文件存储是nfs(网络文件系统),可以在web服务器启动时挂载,实现多个web服务器使用同一套网站程序,简化代码发布工作。WEB服务器开启OPCache,多服务器访问同一个nfs也没有压力。
四、使用腾讯云MySQL服务器存储用户数据和用户成绩。腾讯云MySQL支持主从配置,可以搭配成读写分离的结构。由于本项目的数据库写入是后台任务写入的,不占用服务器性能,所以其实MySQL的压力不大,不需要读写分离。
五、使用Redis服务器存储session、学生成绩、排名。学生答卷提交后,保存在Redis里,提交答卷后会看到排行榜,也是由Redis计算所得。
六、使用腾讯云CDN加速静态资源。网站的图片、js、css等静态资源,全部走腾讯云CDN,以分担服务器的带宽压力和文件系统压力。
七、使用腾讯云CVM云主机,安装Nginx和PHP-FPM,提供Web服务
综上所述,一个客户端的一次请求大概是这样的:
1、发起请求,DNS解析域名,随机分配一个负载均衡主机的IP给客户端
2、客户端访请求负载均衡主机,负载均衡主机根据Web服务器的健康状况,把请求随机分配给一个web服务器处理。
3、Web服务器从OPCache或者文件服务器获取程序并执行,期间会访问MySQL和Redis服务器,最后把结果返回给客户端
4、客户端得到动态网页内容,并从CDN服务器加载图片、js、css等静态资源,显示网页