概述:
我有一个摄影棚,可以拍照并发送到我的网络应用程序。然后我的网络应用程序存储用户数据,并将图片发送到用户的facebook个人资料/粉丝页面。
我的web应用程序运行RubyonRails@HerokuCedar堆栈。
流量:
- 我的网络应用程序通过POST从摄影棚接收照片,就像网络表单一样
- 展台等待服务器响应。如果上传失败,它将再次发送图片
- 只有在facebook上传完成后,才会触发来自webapp的响应
问题:
Webapp只在所有处理完成后才将数据发送到摄影棚。很多时候,这种情况会在30秒后发生。这导致Heroku发射H12-超时。
解决方案
在上传文件时保持请求有效(返回一些响应数据以防止heroku触发H12-https://devcenter.heroku.com/articles/http-routing#timeouts).-有可能吗?如何在Ruby中实现这一点?
更改为Unicorn+Nginx并激活上传模块(这样dyno只有在上传完成后才会收到请求-Unicorn+Rrails+Large Uploads)。真的有可能吗?
使用机架超时宝石。这会让我的很多直通上传失败,所以这些照片永远不会发布在脸书上,对吧?
更改架构直接上传到S3,旋转一个工人检查上传到S3 bucket的新图片,下载并发送到Facebook。-这个可能是最好的一个,但它需要很多时间和精力。从长远来看,我可能会这么做,但我现在正在寻找一个快速的解决方案
其他
有关此问题的更多信息。
来自Rapgenius:http://rapgenius.com/Lemon-money-trees-rap-genius-response-to-heroku-lyrics
十天前,由于服务于我们编译的javascript,我们开始运行很多ab基准测试。我们注意到我们得到的数字一直比数字差Heroku及其分析合作伙伴New Relic向我们报告。对于例如,Heroku报告的静态版权页面响应时间40ms;我们的工具显示6330ms。什么可以解释这么大的区别?
Heroku的一位工程师说:"请求在dyno级别的队列中等待。"告诉我们,"然后很快得到服务(因此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和移动应用程序。在这种情况下,我们没有兑现这一承诺。我们未能:
- 正确记录路由在Bamboo堆栈上的工作方式
- 了解我们的客户正在经历的服务降级,并采取纠正措施
- 识别并更正路由层报告并由第三方工具显示的令人困惑的指标
- 清楚地传达我们路由服务的产品策略
- 为客户提供从Bamboo上的非并发应用程序到Cedar上的并发Rails应用程序的升级路径
- 实现Heroku的承诺,让您在担心基础设施的同时专注于开发应用程序
我们正在立即采取以下行动:
- 改进我们的文档,使其准确反映我们的服务在Bamboo和Cedar堆栈中的工作方式
- 删除Heroku或New Relic等合作伙伴服务报告的不正确和令人困惑的指标
- 添加指标,让客户确定排队对应用程序响应时间的影响
- 提供额外的工具,开发人员可以使用这些工具来增加我们的延迟和排队度量
- 努力在Cedar上更好地支持并发请求Rails应用程序
- 这篇博客文章的其余部分解释了我们路由基础设施的技术细节和历史,以及决策背后的意图我们一路走来所犯的错误以及我们所认为的前进的道路
1)您可以使用Unicorn作为应用服务器,并将独角兽主机杀死一名工作人员之前的超时设置为大于您的请求所需的秒数。下面是一些设置示例,您可以看到30秒的超时。
Nginx不适用于heroku,所以这是没有选择的。
2) 更改架构也会很好,不过我会选择一个选项,而不是上传流量不会阻塞我自己的服务器,比如TransloadIt。例如,它们将帮助您将图片上传到S3,并进行自定义转换、裁剪等,而无需添加额外的dynos,因为您的进程被文件上传阻止。
添加:3)架构的另一个变化是在一个操作中只处理接收部分,并将上传到facebook的任务交给后台工作人员(例如使用Sidekiq)。