【问题标题】:How to change default request time out on Heroku?如何更改 Heroku 上的默认请求超时?
【发布时间】:2014-02-13 09:01:40
【问题描述】:

我的应用是在 Rails 上构建的,而我的生产服务器是在 Heroku 上的。

我的应用程序主要用于文件上传和文件处理,处理请求需要 50 多秒。根据 Heroku 配置,我的请求没有及时响应,由于请求超时,它会将我发送到应用程序错误页面。

如何更改 Heroku 上的请求超时配置?

请帮助我使应用程序正常工作。

【问题讨论】:

  • 最好不要让文件上传阻塞 Heroku dyno。尝试例如Ink Filepicker 将内容上传到 S3。
  • 它不会花费更多时间上传它需要更多时间处理文件,例如从 excel 读取数据。还需要更多时间从可用数据构建 excel 文件。
  • 可以将花费超过超时时间的事情移到后台作业中(请参阅 Sidekiq、Resque 或延迟作业)。然后您可以下载或通过电子邮件发送结果。

标签: ruby-on-rails ruby-on-rails-3 heroku


【解决方案1】:

根据Heroku's documentation这是不可能的

超时值不可配置。如果您的服务器需要更长的时间 完成给定请求的时间超过 30 秒,我们建议移动 工作到后台任务或工作人员定期 ping 您的服务器 查看处理请求是否已完成。这种模式释放 您的 Web 进程最多可以完成更多工作,并且总体上会减少 应用程序响应时间。

【讨论】:

    【解决方案2】:

    您应该将大文件直接上传到 Amazon S3 或类似设备,然后使用 Heroku 后台工作程序处理文件。通常,您的网页会使用某种轮询(通常是 AJAX 请求)来查看处理何时完成并更新前端。

    【讨论】:

      【解决方案3】:

      如前所述,您需要在后台处理它,因为您无法更改 Heroku 强制执行的超时。这实际上是一件好事,因为它可以实现更好的设计,其中 Web 应用程序具有响应性,并且还可以更好地扩展。

      这意味着您需要使用诸如 delayed job 之类的东西,您可以在 Heroku here 上阅读它。

      事情的流程是这样的:

      1. 在 Heroku 强制执行的硬限制(超时)内上传文档。
      2. 安排后台作业处理文档并向浏览器返回 200 OK。
      3. 浏览器等待完成,例如后台 AJAX 轮询标志以查看后台作业何时准备就绪。
      4. delayed 作业会执行计划的作业,并在完成后设置标志以指示后台作业已完成。
      5. 浏览器现在可以通知用户它已完成(取决于您的应用程序知道什么适合)。

      这是一个如何做到这一点的想法。你有几种不同的方法可以做到这一点,延迟工作只是你可以选择的一种。

      【讨论】:

        【解决方案4】:

        提到的 Heroku 文档是正确的,但 30'' 适用于生成任何输出,然后您有 50'' 继续生成更多输出块。所以我认为只要你在 30'' 超时之前上传并开始生成一些东西你就很好。重要的是在您的 Web 框架中使用 streaming 支持,例如在 Rails 中使用 ActionController::Live 关注点。这会修改 HTTP 响应以使用分块传输编码和其他响应标头。我让它不是用于上传,而是用于生成长/慢的 csv/xlsx 文件。这是code repoapp 的示例。使用 curl (curl -i https://megatux-stream-test.herokuapp.com/exporter.csv ) 更容易看到。 为了更好地反馈上传+处理,我将添加一些服务器发送事件 (SSE) 处理代码。

        【讨论】:

          猜你喜欢
          • 2011-02-04
          • 2014-07-18
          • 1970-01-01
          • 2020-06-20
          • 1970-01-01
          • 2011-01-15
          • 1970-01-01
          • 1970-01-01
          • 2014-06-22
          相关资源
          最近更新 更多