我在网上阅读了很多关于Rails中文件上传的内容,导致Web应用程序挂起,我想知道Heroku Dyno是否属于这种情况?如果用户要上传1个gig文件,那么这会导致应用程序的其余部分在单个dyno上托管时挂起吗?
答案 0 :(得分:2)
默认情况下,Rails不是线程安全的。这意味着每个运行的Rails实例一次只能处理一个请求。
在Heroku上,你可以在一个dyno上运行1个进程。那可能是Thin,Unicorn,delayed_job worker等等。
由于Rails默认情况下不是线程安全的,因此Thin一次只能处理1个请求(这意味着你的dyno一次只能处理1个请求)。在这种情况下,当用户上传1 GB文件时,Thin只能处理该请求=导致下一个挂起请求。要解决这个问题,你必须缩放动力学数量。例如,运行4个dynos(运行Thin),您可以一次处理4个请求。
但是,如果你在Heroku dyno上使用Unicorn,并将Unicorn worker数量设置为4,那么Rails一次可以处理4个请求。独角兽很聪明。它在单个Heroku dyno中产生了4个进程。这意味着当您上传1 GB文件时,Unicorn会继续并在那时处理3个请求。这一切都在一个dyno上运行。
有关Heroku和Unicorn的更多信息,请查看此文章:http://michaelvanrooijen.com/articles/2011/06/01-more-concurrency-on-a-single-heroku-dyno-with-the-new-celadon-cedar-stack/
希望这有帮助。
<强>更新强>
如果您将文件上传到S3,您实际上可以完全跳过您的dynos并将文件直接上传到S3。只是一个提示。 ; - )