使用 Rails 3 + Heroku 动态缓存远程图像的策略



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

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

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

以下是

我的做法:

首先,在

引用这些图像之一的所有位置,改为在自己的应用中调用控制器上的操作。然后,编写该控制器操作以执行以下操作:

  1. 给定文件名,
  2. 检查您的 S3 存储桶中是否存在该映像;如果是,请返回指向该映像的 S3 链接。
  3. 如果没有,请下载并存储到 S3;然后返回 S3 链接。

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

当然,如果您可以自己预缓存所有这些远程映像,则可以简化操作。也许是一个耙子任务,可以下载所有这些图像并将它们存储在 S3 中。

希望这有帮助。

最新更新