为了账号安全,请及时绑定邮箱和手机立即绑定

WEB开发中。下载服务器上面的报表。怎么防止数据量过大导致超时的场景

WEB开发中。下载服务器上面的报表。怎么防止数据量过大导致超时的场景

三国纷争 2019-02-22 19:13:33
问题 需要服务端生成报表,由于数据量过大。往往会导致下载过程中504错误。 下载流程已经最优化了。 目前解决方案 前台点击下载报表,发起一个异步请求。后台处理完数据以后。把数据通过邮箱的方式发给下载者。 有没有其它更加好的办法,可以解决这个问题?谢谢。
查看完整描述

5 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

谢谢各位的回答。
这边我自己总结了一下,根据我自己的实际情况主要

  1. 前台异步提交一个请求,后台进行异步组合报表。然后通过1. 邮件的方式通知用户2. 通过定时器将消息PUSH给用户,让用户去相应的地址上下载
  2. 查询时间精确到秒。在用户请求之前,先告诉用户在这个时间段订单个数。我们可以设定一个合理的值来提示用户(改动最小)
  3. 采取任务的形式,前台提交一个任务给后台,后台创建一个任务,并且存入数据库。前台可以每隔30s向后台请求,获取任务的状态,以防止超时。相应的前台有一个loading框(这里也可以改成将文件的生成过程放在服务端,然后这里给用户返回的是一个连接,用户可以直接点连接来下载文件)(这个类似使用AJAX的长连接模式)
  4. 把分析过程放在服务端。服务端起一个定时任务,隔段时间去分析这些数据。直接生产文件放在服务端。可以提供给用户一个下载列表直接提供给用户下载
    5.优化流程,采取dubbo批量数据请求。采取dubbo异步请求。多线程处理数据。多个dubbo服务合并(性能优化)
查看完整回答
反对 回复 2019-03-01
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

最直接的办法便是,压缩数据(例如导出时进行压缩),调整 CGI 超时时间。这其中,可以考虑节省 CGI 进程(因为即使输出成果已经完成,按照题主的说明,fast_cgi 的 response buffer 肯定是远远小于这次输出的大小),在最后输出的过程上用其他服务(例如直接用nginx)代劳。

其实,例如在问题中的这种从产品设计的角度解决问题在我看来最优解,实时下载真的是那么必要吗?

查看完整回答
反对 回复 2019-03-01
?
九州编程

TA贡献1785条经验 获得超4个赞

边读数据,边写数据,比如分页读写,这样就不会超时了

查看完整回答
反对 回复 2019-03-01
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

换个思路,你的所有问题都在超时上面! 为什么超时,因为等待时间过长。那为什么要等待呢???

你可以发出请求,服务器端执行,告诉用户,正在执行,表示就成功了。然后就是用户接受邮件的等待。

这个时候,你可以告诉用户需要等待,或者加一个消息通知,成功后通知用户

查看完整回答
反对 回复 2019-03-01
  • 5 回答
  • 0 关注
  • 1185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信