【发布时间】:2012-09-24 16:14:47
【问题描述】:
概述:
我有一个照相亭,可以拍照并将它们发送到我的网络应用程序。 然后我的网络应用程序存储用户数据并将图片发送到用户 facebook 个人资料/粉丝页面。
我的网络应用运行 Ruby on Rails @ Heroku Cedar 堆栈。
流程:
- 我的 web 应用程序通过 POST(如 Web 表单)从 photobooth 接收照片。
- 展位等待服务器响应。如果上传失败,会重新发送图片。
- 只有在 Facebook 上传完成后才会触发来自 webapp 的响应。
问题:
Webapp 仅在所有处理完成后才将数据发送到 photobooth。很多时候这将在 30 秒后发生。这会导致 Heroku 触发 H12 - Timeout。
解决方案?
在上传文件时保持请求处于活动状态(返回一些响应数据以防止 heroku 触发 H12 - https://devcenter.heroku.com/articles/http-routing#timeouts)。 - 可能吗?如何在 Ruby 中实现这一点?
改成 Unicorn + Nginx 并激活上传模块(这样 dyno 只会在上传完成后接收请求 - Unicorn + Rails + Large Uploads)。真的可以吗?
使用 rack-timeout gem。这会使我的很多直通上传失败,所以这些照片永远不会发布到 Facebook 上,对吧?
更改架构。 直接上传到 S3,旋转工作人员检查上传到 S3 存储桶的新图片,下载它们并将它们发送到 Facebook。 - 这个可能是最好的一个,但需要很多时间和精力。从长远来看,我可能会这样做,但我现在正在寻找一个快速的解决方案。
其他...
【问题讨论】:
-
这个过程的哪一部分需要 30 秒?这些照片有多大?
-
整个过程。从图片上传(启动到 webapp)直到图片发布到 Facebook。
-
...当然,但是这些时间都去哪儿了?如果你不知道它们为什么慢,就很难加快速度。 Heroku 服务器速度快且连接良好;移动一张照片不需要 30 秒。
-
我认为当展位连接(它使用移动互联网连接,而巴西的那些并不真正可靠)断开时会发生这种情况。所以照片上传卡住了,服务器一直在等待上传。然后展位重新连接并连接到另一个测功机以发送照片,再次下降并阻止第二个测功机......等等
标签: ruby-on-rails-3 file-upload heroku nginx timeout