-
背景
- 有运营同学反馈,最近导出excel会出现超时的情况,初步判断是数据增长太快,数据量太大,请求时间超过了设置的超时时间
-
尝试
- 有考虑直接更改该请求的超时时长,可是治标不治本
- 网上搜索发现,有很多人说采用多线程的方式,还没尝试过,不过最近另一个项目使用多线程出现了内存溢出的情况。。。暂时不考虑
-
方案
- 后来找了机智的德叔咨询之后get到一个解决方案,相对简单。整体思路是,后端在开始处理请求之后,维护一个请求的状态用来标记文件是否已经生成,如果文件已经生成,将文件上传到云端返回下载地址,将地址记录,直到下次请求时将地址返回,供前端同学下载。
- 具体流程如下
- 前端同学第一次请求,后端接到请求之后开始生成文件,并返回前端正在处理,用redis记录该次请求,标记状态为正在创建文件
- 前端同学需要定时轮询接口,查看文件链接是否生成,可在页面上设置loading效果(直到get到文件的下载url)
- 文件生成之后,修改redis记录状态为已生成,且记录地址url,下次接口请求时返回该url。
- 流程图是这样的
-
总结
- 重点是在于采用了异步的思想取代原来同步的流程,这样请求就不会出现超时的情况,无论处理多久都木有关系
- 这里采用redis来记录也是考虑到下载会有一个过期时间,一个请求可能过一段时间就无效了