Heroku,H12和passthrough上传超时

时间:2012-09-24 16:14:47

标签: ruby-on-rails-3 file-upload heroku nginx timeout

概述:

我有一个拍照片并将它们发送到我的网络应用程序。 然后我的Web应用程序存储用户数据并将图片发送到用户的Facebook个人资料/粉丝页。

我的网络应用运行 Ruby on Rails @ Heroku Cedar stack。

流量:

  1. 我的网络应用程序通过POST收到照片的照片,就像网络表单一样。
  2. 展台等待服务器响应。如果上传失败,它将再次发送图片。
  3. 仅在Facebook上传完成后才会触发来自webapp的响应。
  4. 问题:

    Webapp仅在完成所有处理后才将数据发送到照相平板。很多时候这将在30秒后发生。这导致Heroku发射H12 - 超时。

    方案吗

    正在上传文件时

    保持请求存活(返回一些响应数据以防止heroku触发H12 - https://devcenter.heroku.com/articles/http-routing#timeouts)。 - 可能吗?如何在Ruby中实现这一点?

    更改为Unicorn + Nginx 并激活上传模块(这样dyno仅在上传完成后收到请求 - Unicorn + Rails + Large Uploads)。真的有可能吗?

    使用rack-timeout gem 。这会让很多我的passthrough上传失败,所以这些图片永远不会在Facebook上发布,对吗?

    更改架构。将上传内容直接发送到S3,旋转工作人员检查上传到S3存储桶的新图片,下载并将其发送到Facebook。 - 这个可能是最好的,但需要花费大量的时间和精力。从长远来看,我可能会这样做,但我现在正在寻找快速解决方案。

    其他...

2 个答案:

答案 0 :(得分:1)

有关此问题的更多信息。

来自Rapgenius: http://rapgenius.com/Lemon-money-trees-rap-genius-response-to-heroku-lyrics

  

十天前,受到我们编制的一个小问题的刺激   javascript,我们开始运行很多ab基准测试。我们注意到了   我们得到的数字一直比数字更糟糕   由Heroku及其分析合作伙伴New Relic向我们报告。为一个   例如,静态版权页面,Heroku报告平均值   响应时间为40ms;我们的工具说6330ms。什么可以解释   这么大的差异?

     

“请求在dyno级别排队等待,”一名Heroku工程师   告诉我们,“然后快速服务(因此Rails日志显得很快),   但由于队列中的等待,总体时间较慢。“

     

在dyno级别排队?什么?

来自Heroku: https://blog.heroku.com/archives/2013/2/16/routing_performance_update

  

过去几年Heroku的客户偶尔会有   报告了Heroku的无法解释的潜伏期。原因很多   延迟 - 其中一些与Heroku无关 - 但在此之前   一周,我们没有看到这些报告中的共同点。我们现在   知道我们在Bamboo和。上的路由和负载均衡机制   Cedar堆栈为我们的Rails客户创建了延迟问题   表现在几个方面,包括:

     
      
  • 某些请求的无法解释的高延迟
  •   
  • 报告的排队和服务时间指标与观察到的现实之间不匹配
  •   
  • 记录和观察到的行为之间的差异
  •   
     

对于在Bamboo堆栈上运行的应用程序,这些的根本原因   问题是Bamboo堆栈上路由的性质加上   路由集群的逐步,横向扩展。在雪松上   堆栈,根本原因是Cedar被优化的事实   并发请求路由,而某些框架,如Rails,则不是   并发默认配置。

     

我们希望Heroku成为构建,部署和扩展Web和Web的最佳位置   移动应用。在这种情况下,我们没有达到这个承诺。   我们未能:

     
      
  • 正确记录路由在Bamboo堆栈上的工作原理
  •   
  • 了解客户遇到的服务质量下降并采取纠正措施
  •   
  • 识别并更正路由图层报告并由第三方工具显示的混乱度量标准
  •   
  • 清楚地传达我们的路由服务的产品策略
  •   
  • 为客户提供从Bamboo上的非并发应用程序到Cedar上的并发Rails应用程序的升级路径
  •   
  • 在我们担心基础架构的同时,实现Heroku的承诺,让您专注于开发应用程序
  •   
     

我们立即采取以下行动:

     
      
  • 改进我们的文档,以便准确反映我们的服务在Bamboo和Cedar堆栈中的工作方式
  •   
  • 删除Heroku报告的错误且令人困惑的指标或New Relic等合作伙伴服务
  •   
  • 添加指标,让客户确定排队对应用程序响应时间的影响
  •   
  • 提供开发人员可用于增加延迟和排队指标的其他工具
  •   
  • 努力更好地支持Cedar上的并发请求Rails应用程序
  •   
  • 本博文的其余部分解释了我们的路由基础设施的技术细节和历史,以及决策背后的意图   我们一路走来,我们犯的错误和我们的想法是什么   前进的道路。
  •   

答案 1 :(得分:0)

1)您可以使用 Unicorn 作为您的应用服务器,并在unicorn master将工作人员杀死到大于您的请求所需的秒数之前设置超时。这里有一些example setup,你可以看到超时30秒。

Nginx在heroku上不起作用,所以这不是选项。

2)更改体系结构也可以正常工作,但我会选择一个选项,而不是上传流量不会阻止我自己的服务器,例如TransloadIt。它们将帮助您将图片提供给S3以获取示例并进行自定义转换,裁剪等,而无需添加其他动态,因为您的进程被文件上传阻止。

添加:3)架构的另一个变化是只在一个动作中处理接收部分,并将上传到facebook任务给后台工作者(使用例如Sidekiq)。