问题:随着业务量的增加,数据存储也越来越大,当我们从数据库读取数据生成excel时,往往会出现超时情况。
尝试解决方案:
- 考虑直接更改该请求的超时时长。但发现 随着数据增长,依然会出现超时情况;
- 考虑采用多线程的方式,理论可以加快数据的读取效率,但当数据量过大且都加载到内存中是,容易出现OOM的情况
经过一番查找和测试,确定另外一种解决方案:整体思路是,后端在开始处理请求之后,维护一个请求的状态用来标记文件是否已经生成,如果文件已经生成,将文件上传到云端返回下载地址,将地址记录,直到下次请求时将地址返回,供前端同学下载。
具体流程:
- 前端同学第一次请求,后端接到请求之后开始生成文件,并返回前端正在处理,用redis记录该次请求,标记状态为正在创建文件
- 前端同学需要定时轮询接口,查看文件链接是否生成,可在页面上设置loading效果(直到get到文件的下载url)
- 文件生成之后,修改redis记录状态为已生成,且记录地址url,下次接口请求时返回该url。
流程图如下:
ps:
采用异步的方式,是解决超时问题的关键所在;
这里考虑到请求的有效性,选择用redis来记录excel文件生成状态。