【问题标题】:Heroku intermittent H15 'Idle connection' error on upload action上传操作时 Heroku 间歇性 H15“空闲连接”错误
【发布时间】:2015-01-06 08:54:14
【问题描述】:

我有一个在 Ruby 2.1.1 上运行 Rails 4.1.5 的 heroku 应用程序。

该应用程序涉及一些媒体处理,并涉及使用 dropzone JS 的 javascript 上传功能,该操作将照片保存在 Amazon S3 上,然后在后台作业中进行后续处理。

我遇到了一个非常令人沮丧的问题。 Heroku 路由器间歇性地 - 并且取决于 Internet 连接的速度 - 以 H15(空闲连接)状态终止上传操作。我不相信连接真的闲置了,因为使用相同的互联网连接,我可以将类似的文件上传到其他站点。

这与网络测功机的超时无关,因为在路由器首先将其关闭的情况下,请求永远不会到达测功机。

这里会发生什么?

注意:我已经实现了这种 CORS 处理技术: http://www.tsheffler.com/blog/?p=428

日志:

[Timestamp] heroku[router]: at=error code=H15 desc="Idle connection" method=POST path="/console/breeds/57-YAMTALE/photos" host=[host] request_id=634d7680-8b66 -4123-a4bc-fe78dc4e7b90 fwd="[IP]" dyno=web.1 connect=0ms service=90232ms status=503 bytes=0

过程文件:

web: bundle exec rails server thin -p \$PORT -e \$RACK_ENV

可能相关的宝石:

宝石'薄'

gem '载波'

gem 'carrierwave_backgrounder'

gem 'rmagick', :require => 'RMagick'

gem 'aws-sdk'

gem 'rack-cors', :require => 'rack/cors'

gem '守护进程'

gem 'exception_notification'

【问题讨论】:

    标签: ruby-on-rails ruby heroku upload timeout


    【解决方案1】:

    您需要将大文件直接上传到 S3(或同等设备),而不是通过您的 Heroku 应用。您可以将骨灰盒发布到您的应用程序(可能使用 javascript),然后在后台处理从/到 S3。

    不幸的是,这涉及到。

    Heroku 有(实际上非​​常好)关于一种特定方法的说明: https://devcenter.heroku.com/articles/direct-to-s3-image-uploads-in-rails

    详情

    如果 Heroku 路由器在 30 秒内没有收到第一个字节,它将超时。此后,它将跟踪一个 55 秒的滚动窗口,只要一个字节向上或向下传输,该窗口就会被重置。 https://devcenter.heroku.com/articles/request-timeout

    在您的情况下,我猜您的上传时间有时会超过 30 秒。尽管您将文件作为后台任务处理,但我猜您在上传完成之前不会发送回第一个字节。因此间歇性超时。

    在上面引用的同一个 Heroku 文档中:

    许多网络应用程序允许用户上传文件。当这些文件 很大,或者用户的互联网连接速度很慢,上传 可能需要超过 30 秒。为此,我们直接推荐 上传到 S3。

    分块上传

    我相信有另一种方法可以解决这个问题,使用 HTTP 分块上传,可以尽早发送第一个字节的响应。 (这仅适用于支持 55 秒滚动窗口的 Cedar 1.1 和更新版本)

    实际上,分块方法应该比上面的直接到 S3 方法更简单。由于以下几个原因,我从未对此进行过跟进:

    1) Heroku 没有提到它是一个选项。

    2) 这将违背 Heroku 的一般建议:

    最佳做法是让您的网络应用程序的响应时间低于 500 毫秒,这将释放应用程序以处理更多请求,并为您的访问者提供高质量的用户体验。

    3) 它可能(根据我的理解,它会)对 Heroku 的负载平衡产生负面影响,这是原始的(或损坏的,取决于您询问的对象)。

    【讨论】:

      猜你喜欢
      • 2014-11-02
      • 2017-04-19
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      相关资源
      最近更新 更多