一个大量上传答案的业务求解决方案

sprouting 发布于 02/08 15:44
阅读 597
收藏 0

系统是微服务架构,有一个类似提交答案的功能,同时6W人在做试卷,要求不丢失答案,求一个解决方案。

几个重要的点,

第一:答题的时候,前端给后台的数据是全量给的,也就是每回答一道题,将全部的题目ID对应回答提交一次,即使没做也会提交。这主要是防止后面找对应的数据方便。这一点已经定了。

第二:每个人的试卷是不一样的,都是随机的。

第三:绝对不能丢数据,绝对不能丢数据

第四:答题者可能不按套路走,先做第一个,再做第二个,然后又中途退出,退出又进来等等异常情况

第五:回答中有选择题,有问答,还可能有作文等等。

我给出的解决方案是,每次回答都保存到后台,做相关校验后入redis。后台该答题服务部署4个节点,然后使用同一个redis保存考生提交的信息,使用队列形式,一直将这些数据按照规则刷新到minIO 的文件服务器上,也就等于4个线程消费这个队列。最终考生保存最后提交上来的答题信息即可。

领导则认为,6W人同时提交,可能会撑不住,我说做redis集群,1主2从,应该没问题,因为同时有4个线程再消费,再开启RDB和AOF备份,领导认为每五道题提交一次,然后直接保存到磁盘中,等考试时间过了,再取创建最晚时间的试题,上传到文件服务器。我认为这样IO会很高,同时,因为有多个节点,还涉及到不同节点保存同一个人的回答问题,后续处理麻烦。

想问下各位大佬,有没好的办法呢?

加载中
1
Elven_Xu
Elven_Xu

6w人的场景没这么复杂~而且这6w人是不是并发还有待考证呢~两个方案其实都可以

1
kakai
kakai

这种非计算密集型业务需求相对简单,普通web集群就能满足,不要用redis做队列服务,用更专业的队列,更能保证数据完整性。客户端提交数据后,服务器即刻把数据放入队列中,由队列消费者存储到数据库,主服务器使用NIO或AIO模式几乎毫无压力。

0
慕容狗蛋
慕容狗蛋

6w 人其实还可以,并发不算多高。

每个题的作答都实时的发送到服务器,最后提交时把所有题目的作答都发送到服务器。
使用消息队列保存答案,答案处理后才从消息队列中删除,可以使用 ActiveMQ,RabbitMQ。
为了方便流水线式批量主观题批卷,还可以把主观题的作答单独存放到一个 MongoDB Collection 中。

Redis 的作用主要是缓存试卷,避免每次都从数据库获取再生成 (试卷随机是基本功能,可以使用自定义随机数算法,学号作为种子,保证同一个人多次生成的试卷永远一样)。
试卷信息可以使用 MySQL 存储,答案使用 MongoDB 存储。显示整卷的作答时,应用端读取试卷和作答信息,合并为完整数据一次性发送给前端。

这是以前架构的一个考试系统。

gammey
gammey
回复 @慕容狗蛋 : 你随机往某几台写和用cluster最终保存的效果是一样的。也是分片,再做副本。唯一区别是cluster会帮你做分片数据的副本,而你自己写就要写多份。但对于你来说,随机写入应该会容易维护很多。
慕容狗蛋
慕容狗蛋
回复 @gammey : 6w 并发考试的业务,多加几台机器不亏,如果买云主机,不用了随时释放,花不了多少钱。
gammey
gammey
回复 @慕容狗蛋 : cluster 起码6台。slave加哨兵IO和单台是一样的,只解决备份和切换的问题。你要提高IO,最简单就是随机写入某台,最后取出来整理。
慕容狗蛋
慕容狗蛋
回复 @sprouting : Redis 也有高可用啊,Master / Slave, Sentinal, Cluster 等多种方案可选。
gammey
gammey
回复 @sprouting : 建议就开3个redis,你程序写入答案的时候随机往2台写入。同时解决IO和备份的问题。
下一页
0
gammey
gammey

6w人提交只要有队列,不至于撑不住。特别是选择题多的情况,答案数据没多少。

提交时候附带题目ID和提交的时间戳然后全量提交就行。另外就是用负载均衡去多开几个接收答案的服务,多开几个redis就行了,redis之间不需要同步数据,因为只要记录了时间戳,就算多次提交只要记录最新的数据就行。

怕数据丢失,就在redis里随机选两个或三个往里写。

0
皮小将
皮小将

只帮你提一点,6w人同时提交只是你以为,其实你可以在提交的时候做延时,也就是延时后在真正发起请求,可以随机延时,然后这样能降低并发的压力。

sprouting
sprouting
这不是问题,实际同时使用的人远远超过6W,可能同时40W人一起,我们设计的时候要求考虑同时6W的并发
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部