【发布时间】:2014-09-23 20:31:53
【问题描述】:
我在 Heroku 上运行我的 Rails 应用程序。我有一个管理仪表板,允许通过自定义 CSV 上传器批量创建新对象。最终,我将上传 10k-35k 行的 CSV。解析器在我的开发环境中完美运行,通过上传 CSV 成功创建了 20k+ 个条目。然而,在 Heroku 上,我遇到了 H12 错误(请求超时)。这显然是有道理的,因为文件如此之大,并且正在创建如此多的对象。为了解决这个问题,我尝试了一些简单的解决方案,增强 Heroku 的 dyno 功率并将 CSV 文件减少到 2500 行。这些都没有成功。
我尝试将我的delayed_job 实现与将worker dyno 添加到我的procfile 到.delay 文件上传和处理相结合,这样Web 请求就不会超时等待文件处理。但是,这会失败,因为此后台进程依赖于在 Web 请求时保存在内存中的 CSV 上传,因此后台作业在执行时没有文件。
看来我可能需要做的是:
- 作为后台进程执行将 CSV 上传到 S3
- 将 CSV 文件的处理安排为后台作业
- 确保 CSV 解析器知道如何在 S3 上查找文件
- 解析并完成
此解决方案并非 100% 理想,因为上传文件的管理员用户基本上会收到“好的,您发送了说明”确认信息,但无法很好地了解流程是否正确执行。但如果它完成工作,我可以处理并稍后修复。
tl;博士问题
假设上述解决方案是正确/推荐的方法,我该如何正确构建它?我主要不清楚如何安排/创建延迟作业条目,该条目知道在哪里可以找到通过 Carrierwave 上传到 S3 的 CSV 文件。非常感谢任何和所有帮助。
请索取任何有用的代码。
【问题讨论】:
标签: ruby-on-rails heroku amazon-s3 carrierwave delayed-job