概述:
我有一个拍照片并将它们发送到我的网络应用程序。 然后我的Web应用程序存储用户数据并将图片发送到用户的Facebook个人资料/粉丝页。
我的网络应用运行 Ruby on Rails @ Heroku Cedar stack。
流量:
问题:
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。 - 这个可能是最好的,但需要花费大量的时间和精力。从长远来看,我可能会这样做,但我现在正在寻找快速解决方案。
其他...
答案 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)。