【问题标题】:Rails/Heroku - How to create a background job for process that requires file uploadRails/Heroku - 如何为需要上传文件的进程创建后台作业
【发布时间】: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 上传,因此后台作业在执行时没有文件。

看来我可能需要做的是

  1. 作为后台进程执行将 CSV 上传到 S3
  2. 将 CSV 文件的处理安排为后台作业
  3. 确保 CSV 解析器知道如何在 S3 上查找文件
  4. 解析并完成

此解决方案并非 100% 理想,因为上传文件的管理员用户基本上会收到“好的,您发送了说明”确认信息,但无法很好地了解流程是否正确执行。但如果它完成工作,我可以处理并稍后修复。

tl;博士问题

假设上述解决方案是正确/推荐的方法,我该如何正确构建它?我主要不清楚如何安排/创建延迟作业条目,该条目知道在哪里可以找到通过 Carrierwave 上传到 S3 的 CSV 文件。非常感谢任何和所有帮助。

请索取任何有用的代码。

【问题讨论】:

    标签: ruby-on-rails heroku amazon-s3 carrierwave delayed-job


    【解决方案1】:

    您可以将需要处理的文件放在特定的 S3 存储桶中,无需将文件名传递给后台作业。

    后台作业可以从特定的 s3 存储桶中获取文件并开始处理。

    要向用户提供实时更新,您可以执行以下操作:

    1. 使用 memcached 来维护状态。后台作业应不断更新状态信息。如果不熟悉缓存,可以使用 db 表。

    2. 在用户响应中包含 javascript/jquery。此脚本应发出 ajax 请求以获取状态信息并向在线用户提供更新。但是如果是一个大文件,用户可能不想等待作业完成,在这种情况下最好提供一个查询接口来检查作业状态。

    3. 后台作业应在完成时从存储桶中删除/移动文件。

    在我们的应用中,我们允许用户导入多个模型的数据并开发了通用设计。我们在 db 中维护状态信息,因为我们对其进行了一些分析。如果您有兴趣,这里有一篇描述我们设计的博客文章http://koradainc.com/blog/。该设计没有描述后台进程或S3,但结合以上步骤应该可以为您提供完整的解决方案。

    【讨论】:

      【解决方案2】:

      我主要使用sidekiq 在heroku 上对异步进程进行排队。

      This link 也是一个很好的资源,可以帮助您开始使用 heroku 实施 sidekiq。

      【讨论】:

        猜你喜欢
        • 2012-10-14
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        相关资源
        最近更新 更多