功能优化
直播账号创建优化
场景:每个企业云用户在直播时需要登录第三方直播账号,如果没有,则创建一个直播账号
问题:创建直播账号的服务是第三方提供的,不支持高并发
优化:在用户登录的时候调用直播服务,初始化直播账号,将创建直播账号的并发压力分散到用户登录期间,这个优化经历了几个版本,最终我们使用方案3实现。
方案1:在登录的回调函数中同步调用直播服务创建账号。这个方案存在的问题是,假如创建直播账号的服务响应缓慢、异常将影响用户登录。
方案2:在登录的回调函数中异步调用直播服务创建账号。这个方案解决了方案1的问题,但代码、服务依然耦合在一起。登录本不应该依赖直播服务,如果以后需要在登录功能上做另外一些额外的预处理和通知,将会让登录的功能变得复杂且职责不清。
方案3:在登录的回调函数中发送一个主题消息,并投递到MQ,之所以选择主题消息而不是点对点消息,是考虑到未来可能会在登录的时候做其他的一些业务操作。直播业务通过订阅登录消息,收到消息后进行账号初始化、缓存,使登录服务与创建直播账号服务完全解耦,并且有良好的扩展性。
通过消息队列削峰异步处理
场景:生成试卷、保存草稿、提交试卷
问题:这些场景有着较高的并发,这些业务操作本身也比较复杂,原先的同步调用在高并发的场景下会导致服务处理不过来,提示业务操作失败
优化:将同步操作改为消息+轮询的方式。
1、 用户点击考试的的时候发送出卷的消息,并在redis中写入出卷中的状态并返回客户端
2、 后端根据业务需要配置处理线程数(生成试卷这里配置了100个线程),执行业务操作,在出卷完成后将试卷放到redis中,并擦除redis出卷状态。
3、 客户端首先延迟1s再发轮询请求(调用出卷请求后马上开始轮询,这时大部分情况下后端是还没出好试卷,所以这个请求意义不大),然后再间隔每两秒轮询,处理完成,再获取试卷数据。
通过缓存提升服务响应时间、降低DB读压力
场景:获取期次、章节、课时单元、试卷、考试、题目信息等
问题:之前的这些操作基本都是