我有一个包含大量行的大型数据库,用户在数据库上生成查询,然后想要导出信息(当前正在执行CSV).问题是,随着我们的数据库不断增长,查询需要很长时间才能下载尝试超时.
如何在创建时随时设置Rails来下载文件?这些请求并不常见,所以我不介意对服务器的严厉打击,但它们确实需要是动态的(我不能提前生成文件).
我找到了很多关于如何在Rails中下载文件的网站,但它们要么处理已经创建的文件,要么处理那些没有时间创建的小文件.这些文件可能非常大(20MB +),因此需要"流式"下载,但我找不到某种方法.
我建议使用后台工作服务,如延迟工作或sidekiq for rails,
告诉您的用户他们的报告很快就会准备就绪,并将其安排到后台工作人员服务,在报告生成工作结束时向用户发起通知(websockets,email,...),然后允许用户下载从您使用的任何存储中生成的文件 - 本地,S3等
与流媒体大型响应相比,这有以下好处:
1名来自会计的用户想要制作他的季度报告捆绑的20份大型报告,不会因为工人用尽而冻结所有流量的网络主机,因此您的CEO仍然可以登录查看他的号码
你可以减少后台服务上的工作人员数量,因此当第1点的所述用户来访问你时,大型复杂查询不会压倒你的数据库
文件的服务将由服务器前面的Web服务器或S3完成,而不是工作进程(rails可能很慢)