如何在Heroku多个dynos上使用carrierwave缓存?

时间:2012-06-12 16:57:14

标签: ruby-on-rails caching heroku carrierwave

我在Heroku上有一个Carrierwave的应用程序。在页面上,我有两种形式:1个用于上传图片的ajax表单和1个用于创建对象所需的其他信息的普通表单。假设我的Carrierwave挂载为:picture,每次提交ajax表单时,图片会暂时保存到公用文件夹中,其路径将返回:picture_cache。然后,第二种形式使用它来知道在第二个请求上使用新对象创建哪个图片。这适用于单个dyno。

不同的dynos不了解彼此的文件系统。因此,如果提交第二张表格的请求与第一张表格的请求没有达到相同的dyno,则它无法找到该图像。

有没有人解决过这个问题?

1 个答案:

答案 0 :(得分:2)

我使用自定义模型并在mongodb中存储所有文件,包括tmp文件。上传标记为tmp。模型被“保存”的我只需删除'tmp'标志。通过这种方式,所有节点始终可以看到所有图像。由于许多多节点配置会出现这个问题(除非平衡器实现了会话亲和性),因此很多时候,载波浪的默认值是缓存在./tmp中。

这是我的模型和控制器等:https://gist.github.com/3161569

你必须在表格中做一些自定义工作:

  • 保存发布的每个文件,无论是什么
  • 将发布的文件ID转发到隐藏字段
  • 在保存时查找文件和/或以前上传的ID
  • 制作模型关联

这种方法,虽然它不是'魔术'也会产生以下令人敬畏的副作用:

  • 你有一个进程在后台运行作业缩略图像而不是每当用户点击'提交'时就会旋转image_magick(这是严重的 DOS向量,尤其是像heroku这样的内存受限主机

  • 您可以在后台,每小时,无论如何将图像迁移到s3,并且上传只需要一个新网址(在这种情况下,控制器需要发出永久重定向,如果它注意到这一点)。这非常好,因为您可以将它们保存在数据库中以进行开发,登台等,并在不更改任何上载或查看代码的情况下将部分或全部上传内容迁移到s3。

相关问题