1

我在网上阅读了很多关于在 Rails 中上传文件会导致 Web 应用程序挂起的区域,我想知道 Heroku Dyno 是否属于这种情况?如果用户要上传 1 gig 文件,那么如果它托管在单个测功机上,这会导致应用程序的其余部分挂起吗?

4

1 回答 1

2

默认情况下,Rails 不是线程安全的。这意味着每个运行的 Rails 实例一次只能处理一个请求。

在 Heroku 上,您可以在单个测功机上运行 1 个进程。这可能是 Thin、Unicorn、delayed_job 工人等。

由于 Rails 默认情况下不是线程安全的,因此 Thin 一次只能处理 1 个请求(这意味着您的 dyno 一次只能处理 1 个请求)。在这种情况下,当用户上传 1 GB 文件时,Thin 只能处理该请求 = 导致下一个请求挂起。要解决这个问题,您必须缩放测功机的数量。例如运行 4 个 dynos(运行 Thin),一次可以处理 4 个请求。

但是,如果您在 Heroku 测功机上使用 Unicorn,并将 Unicorn worker 数量设置为 4,那么 Rails 一次可以处理 4 个请求。独角兽很聪明。它在单个 Heroku dyno 中生成 4 个进程。这意味着当你上传一个 1 GB 的文件时,Unicorn 会继续处理 3 个请求。这一切都在一个测功机上运行。

查看这篇文章以获取有关 Heroku 和 Unicorn 的更多信息:http: //michaelvanrooijen.com/articles/2011/06/01-more-concurrency-on-a-single-heroku-dyno-with-the-new-celadon-雪松栈/

希望这可以帮助。

更新

如果您将文件上传到 S3,您实际上可以完全跳过您的测功机并将文件直接上传到 S3。只是一个提示。;-)

于 2012-09-19T16:26:05.950 回答