【问题标题】:Strategy for on-the-fly caching of remote images with Rails 3 + Heroku?使用 Rails 3 + Heroku 即时缓存远程图像的策略?
【发布时间】:2012-07-04 10:58:43
【问题描述】:

我是一个 Rails 新手,所以我不确定我应该如何构建它,并希望得到一些意见。

基本上,我想向我的应用程序用户展示一些图像(具有可预测的文件名)。我会把它们从远程主机上取下来,但当然我不想为每个请求都在那里进行热链接,所以我想以某种方式将它们缓存在我的服务器上。理想情况下,当有人第一次请求图像时,它会从远程服务器下载并呈现给用户,而对于同一图像的后续请求,它将像任何其他静态资产一样被提供和缓存。

通常我只会将图像下载到本地文件系统,位于 public 文件夹中的某个位置,但是由于我在 Heroku 上运行此应用程序,因此我没有持久的写入权限。在我的情况下,处理这一切的好策略是什么?不是在代码中寻找完整的解决方案,只是一些指针。谢谢!

【问题讨论】:

  • 下载后是否要编辑它们?我认为您可以使用 Redis 之类的东西临时存储它们.. /two_cents

标签: ruby-on-rails ruby caching heroku


【解决方案1】:

这是我的处理方法:

首先,您可以在任何地方引用其中一张图片,而不是在您自己的应用中调用控制器上的操作。然后,编写该控制器操作以执行以下操作:

  1. 给定一个文件名,
  2. 检查图像是否存在于您的 S3 存储桶中;如果是,则将 S3 链接返回给它。
  3. 如果没有,下载并存储到S3;然后将 S3 链接返回给它。

由于您使用的是 Heroku,因此更好的方法可能是让该操作启动延迟作业以检索图像(并将其存储在 S3 中)。然后,在您的视图中,有一个轮询机制来定期询问控制器操作是否图像可用。如果不是,则显示加载图标,如果是,则显示图像(指向 S3 上图像的 URL)。在等待图像被缓存时,走这条路线不会占用您的任何一台测功机。

当然,如果您可以自己预先缓存所有这些远程图像,事情就可以简化。也许是一个 rake 任务,它会下载所有这些图像并将它们存储在 S3 中。

希望这会有所帮助。

【讨论】:

  • 谢谢,我会试试这样的!
  • 这个解决方案对性能不是很好。如果您首先必须检查每个图像的 s3 中是否存在图像,您将看到每个图像的一些延迟,即使在缓存时也是如此。预缓存的建议可能是一个更好的主意。
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2012-03-07
  • 2011-03-06
  • 2010-10-08
  • 2014-12-17
  • 2010-11-21
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多