Heroku间歇性H15'空闲连接'上传操作错误

时间:2014-11-10 05:21:24

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

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

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

我有一个非常令人沮丧的问题。 Heroku路由器间歇性地 - 并且依赖于互联网连接的速度 - 以H15(空闲连接)状态杀死上传动作。我不相信连接已经空闲,因为使用相同的互联网连接,我可以将类似的文件上传到其他网站。

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

这里可能会发生什么?

注意:我已经实现了这种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

Procfile:

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

可能相关的宝石:

宝石'瘦'

gem'carrierwave'

gem'carrierwave_backgrounder'

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

gem'aws-sdk'

gem'chack-cors',:require => '机架/ CORS'

宝石'守护进程'

gem'exception_notification'

1 个答案:

答案 0 :(得分:0)

您需要将大文件直接上传到S3(或同等版本),而不是通过您的Heroku应用程序。您可以将urn发布到您的应用程序(可能使用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文档中:

  

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

分块上传

我相信有一种替代方法可以使用HTTP分块上传来解决这个问题,其中可以在早期发送第一字节响应。 (这只适用于Cedar 1.1和更新版,它支持55秒滚动窗口)

事实上,分块方法应该比上面的直接S3方法更简单。我从来没有跟进过这个原因有几个原因:

1)Heroku没有提及它作为一种选择。

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

  

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

3)它可能(根据我的理解,它会)对Heroku的负载平衡产生负面影响,这是原始的(或根据你的要求而破坏)。