在线考试系统需求:

1. 将线下考试转移到线上进行,包括学生登录、进入试卷页面、答题、交卷等关键环节;

2. 试题要涵盖普通考试绝大部分题型,包括但不限于单选题、多选题、判断题、简答题、英语阅读题、英语听力题等,复杂公式题可以提交图片答案;

3. 有限预算内,尽可能满足多人同时在线考试。

需求分析:

1. 各种题型的实现,需要收集各种题型,总结得出相同的题型模板

2. 提交图片答案,有两种提交点,一是在交卷时一并提交,二是考试中ajax异步提交,很明显,多人同时在线考试,一般都会在最后的几分钟交卷的人最多,会对服务器造成很大的负荷,所以这里就选择在考试中提交图片答案。

3. 多人同时在线考试

因为考试是有考试时间段的,进入考试以及交卷,这两个时间点都有可能造成高并发的请求,缓解这两个点的压力,无疑是提高在线考试系统能承受同时考试的人数最有效的手段。

进入考试时,需要获取试卷数据,如果全都从数据库获取,那对服务器的压力是很大的,如果将试卷数据放在缓存中,将有效的解决这个问题;

交卷时,不仅需要对学生答案进行入库操作,还要对题目做各种操作,比如记录题目的PV,正确率等,如果做完这些才返回,肯定会占用很大的服务器资源,不如,将答案数据放到消息队列rabbitMQ中,然后响应学生的交卷请求,在另一个服务器中,读取rabbitMQ中的答案消息,再进行入库及相关操作。

架构设计:

学生进入考试,如果redis中有试卷缓存,则直接读取缓存

如果redis缓存中没有,则读取MySQL中的试卷数据,并存一份到缓存中,下一个学生进入试卷时,就可以获取缓存中的试卷数据了

考试中提交图片答案,这里选择提交到阿里云oss,进一步提高在线考试系统最大负载量

交卷时,直接将答案数据放到rabbitMQ中,然后在另一个服务器中,获取答案消息进行入库以及相关操作。答案数据,有这些特点:量大、读多、改少,基于这样的特点,MongoDB是个不错的选择。

架构也仅是停留在思想的层面,真正的实践还是需要手撕代码

涉及的技术栈:Redis、MySQL、RabbitMQ、MongoDB、阿里元oss

之前的文章有介绍golang简单操作Redis、MySQL、RabbitMQ、MongoDB、阿里元oss

以上架构谈不上最佳,但对与中小企业来说是个不错的选择

真正的实践中还是会遇到各种问题的,比如外网访问存在阿里云oss的资源是需要消耗流量的,访问很多的话会费不少预算,不过也是有解决办法的,oss+cdn就是个不错的选择;再比如,rabbitMQ的消息可靠投递,确认消费,怎么在速度与安全之间取舍

高手过招,点到为止,还意犹未尽的,可在评论区留言