Ruby on rails 如何在Heroku多个dynos上使用carrierwave缓存?
我在Heroku上有一个带有Carrierwave的应用程序。在一个页面上,我有两个表单:一个用于上传图片的ajax表单和一个用于创建对象所需的附加信息的普通表单。假设我的Carrierwave挂载是Ruby on rails 如何在Heroku多个dynos上使用carrierwave缓存?,ruby-on-rails,caching,heroku,carrierwave,Ruby On Rails,Caching,Heroku,Carrierwave,我在Heroku上有一个带有Carrierwave的应用程序。在一个页面上,我有两个表单:一个用于上传图片的ajax表单和一个用于创建对象所需的附加信息的普通表单。假设我的Carrierwave挂载是:picture,每次提交ajax表单时,图片都会临时保存到公用文件夹中,其路径将作为:picture\u cache返回。然后,第二个表单使用它来知道在第二个请求中使用新对象创建哪个图片。这适用于单个dyno 不同的dyno不知道彼此的文件系统。因此,如果提交第二个表单的请求与第一个表单的请求没有
:picture
,每次提交ajax表单时,图片都会临时保存到公用文件夹中,其路径将作为:picture\u cache
返回。然后,第二个表单使用它来知道在第二个请求中使用新对象创建哪个图片。这适用于单个dyno
不同的dyno不知道彼此的文件系统。因此,如果提交第二个表单的请求与第一个表单的请求没有达到相同的dyno,则无法找到图像
有人解决过这个问题吗?我使用自定义模型,并将所有文件(包括tmp文件)存储在mongodb中。上载被标记为tmp。如果模型被“保存”,我只需删除“tmp”标志。通过这种方式,所有节点始终可以看到所有图像。carrierwave的默认值是缓存在./tmp中,这是非常疯狂的,因为许多多节点配置都会看到这个问题(除非平衡器实现会话关联) 这是我的模型和控制器等: 您必须在表单中执行一些自定义工作:
- 保存所有发布的文件,无论发生什么
- 将发布的文件id中继到隐藏字段中
- 保存时查找文件和/或以前上载的id
- 创建模型关联
- 您有一个进程在后台运行作业来缩略图像,而不是每当用户点击“提交”(这是一个严重的DOS向量,尤其是在heroku等内存有限的主机上)时旋转图像
- 您可以在后台、每小时或任何时间将图像迁移到s3,上传只需有一个新的url(在这种情况下,如果控制器注意到这一点,则需要发出永久重定向)。这真的很好,因为您可以将它们保存在db for dev、staging等中,并在不更改任何上载或查看代码的情况下将部分或全部上载迁移到s3