【问题标题】:How to use carrierwave cache on Heroku multiple dynos?如何在 Heroku 多个测功机上使用载波缓存?
【发布时间】:2012-07-23 09:24:32
【问题描述】:

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

不同的测功机不知道彼此的文件系统。因此,如果提交第二个表单的请求与第一个表单的请求不同,它就找不到图像。

有人解决过这个问题吗?

【问题讨论】:

  • 你解决过这个问题吗?无需使用 Mongoid?

标签: ruby-on-rails caching heroku carrierwave


【解决方案1】:

我使用自定义模型并将所有文件(包括 tmp 文件)存储在 mongodb 中。上传被标记为 tmp。那些模型是“保存”的,我只需删除“tmp”标志。这样,所有节点始终可以看到所有图像。载波默认缓存在 ./tmp 中是非常疯狂的,因为许多多节点配置会看到这个问题(除非平衡器实现会话亲和性)。

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

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

  • 保存所有发布的文件,无论如何
  • 在隐藏字段中中继发布的文件 ID
  • 在保存时查找文件和/或之前上传的 ID
  • 建立模型关联

这种方法虽然不是“魔法”,但也带来了以下令人敬畏的副作用:

  • 您有 一个 进程在后台运行作业以缩略图图像与每当用户点击“提交”时旋转 image_magick(这是一个 严重 DOS 向量,尤其是内存有限的主机,如 heroku)

  • 1234563这真的很好,因为您可以将它们保留在数据库中以进行开发、登台等,并在不更改任何上传或查看代码的情况下将部分或全部上传迁移到 s3。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 2016-07-08
  • 2014-02-07
  • 1970-01-01
  • 2013-01-23
  • 2013-02-22
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多