适用于Image Heavy App的最佳Ruby on Rails架构

我正在构建一个允许同时上传大量照片的应用程序,并想知道解决此问题的最佳设置。

这是我到目前为止使用的:

  • Jquery文件上传:允许用户拖放图像
  • CarrierWave:处理图像并使用ImageMagickresize
  • Amazon S3:CarrierWave通过Fog将图像上传到Amazon S3
  • Heroku:用于托管

我想允许用户能够将大量图像拖放到页面上,然后在后台进行上传时导航到其他页面。 我还想在完成上传时显示图片。 我不希望这个过程锁定Heroku dynos,所以我可能需要将工作转移到后台工作,但我不确定如何使用我的情况。

这类应用程序的最佳设置是什么? 我应该使用什么背景工人gem? Cloudinary是个好主意吗?

我最近构建了一个在Heroku上接受大量上传的应用程序。 我决定构建自己的解决方案,而不是使用cloudinary或等效的。 以下是我学到的一些课程:

  • 不要上传到heroku。 您的整个Web工作人员将在整个上传期间被锁定。 那是一分钟。 不能接受的。

  • 使用javascript上传器(如jquery-file-upload)直接上传到s3。 起初这有点复杂,但是一旦你开始工作它就太棒了。 您可以使用s3_direct_upload gem,或者您只需阅读其源代码即可从头开始制作您自己的解决方案。 这个gem是基于一个railscasts pro剧集,你必须支付,但有源可用 。

  • 上传完成后,向您的应用程序发出ajax请求,将新的s3 url作为远程URL传递。 然后,Carrierwave将像上传一样处理s3上的图像,除非只需几秒钟而不是一分钟。

  • 使用jquery-file-upload的客户端图像大小调整 。 有人会尝试上传一张5MB的照片然后婊子说上传需要永远。 这样可以在理论上尽可能快地上传所有内容。

  • 配置s3以自动清除上传文件夹 。

  • 不要使用薄。 使用独角兽 。 几秒钟的时间太长,无法处理薄的请求,但有三到四个工人的独角兽更宽容。

  • 不要使用rmagick。 它是复杂图像处理的更好的API,但使用了大量的内存。 请改用mini_magick。

你会注意到我没有使用后台工作者。 如果你真的感觉很细致,你可以让接收远程url的控制器将其工作传递给后台工作者,如果你需要立即得到结果,后台工作人员可以通过pubsub通知UI(faye或pusher,可能是激动人心的新同步gem)。 但这对我的申请来说并不是必需的,而且我宁愿把钱花在另一个网络dyno而不是工作人员dyno上。

而且,是的,如果你想让它们在发生这种情况时点击整个应用程序,你需要在弹出窗口中上传(并使用某种pubsub解决方案),或者将整个网站构建为javascript应用使用余烬或主干或角或其他。

任何问题?

在你提到之前我从未见过Cloudinary,但它似乎非常适合你的项目。

首先,它可能会大大简化您的应用程序。 Cloudinary支持通过其HTTP API 从浏览器直接上传 ,并且已经有一个基于jQuery文件上传的jquery插件 ,并具有类似的function,包括客户端预上载处理。

此外,它支持类似于dragonfly的动态转换(也是一个非常好的lib)。

这意味着,除非您确实需要通过应用程序上传这些图像,否则您可以完全绕过它,直接上传到Cloudify并通过转换API处理图像裁剪和其他转换。

如果需要,您可以从您的应用程序中消除Carrierwave和S3,当然不需要任何背景dynos来处理图像处理。 此外,它可能会更快(直接上传和即时操作与上传到您的应用,处理,然后上传到云),并将消除通过您的应用上传的带宽。

即使没有直接上传,似乎Cloudinary提供的Carrierwave插件仍然可以使用他们的转换API,从而无需您的应用程序处理图像。