【发布时间】:2012-08-20 19:46:03
【问题描述】:
我目前在 Heroku 上托管的应用程序允许用户提交照片。最初,我正在考虑将这些照片存储在文件系统中,因为将它们存储在数据库中显然是一种不好的做法。
然而,Heroku 上似乎没有永久的文件系统,只有一个短暂的文件系统。这是真的吗?如果是的话,我在存储照片和其他文件方面有哪些选择?
【问题讨论】:
标签: heroku
我目前在 Heroku 上托管的应用程序允许用户提交照片。最初,我正在考虑将这些照片存储在文件系统中,因为将它们存储在数据库中显然是一种不好的做法。
然而,Heroku 上似乎没有永久的文件系统,只有一个短暂的文件系统。这是真的吗?如果是的话,我在存储照片和其他文件方面有哪些选择?
【问题讨论】:
标签: heroku
这是真的。 Heroku 允许您创建云应用程序,但这些云应用程序不是“永久的”——它们是可以在 Amazon 的 EC2 上多次复制的实例(或“slug”)(这就是为什么使用 Heroku 可以轻松进行扩展)。如果您要推送应用程序的新版本,那么 slug 将被重新编译,并且您在之前的实例中保存到文件系统的所有文件都将丢失。
您最好的选择(无论是在 Heroku 还是其他方式)是将用户提交的照片保存到 CDN。由于您在 Heroku 上,而 Heroku 使用 AWS,我推荐使用 Amazon S3,可选择启用 CloudFront。
这不仅是因为它绕过了 Heroku 的短暂“限制”,而且因为 CDN 速度更快,并且将为您的 web 应用程序和用户体验提供更好的服务。
【讨论】:
根据您使用的技术,您最好的选择可能是将上传内容流式传输到 S3(亚马逊的存储服务)。您可以通过客户端库与 S3 交互,以简化发布和检索文件。 Boto 是 Python 的示例客户端库 - 它们适用于所有流行语言。
要记住的另一件事是 Heroku 文件系统也不是共享的。这意味着您必须使用与处理上传的应用程序相同的应用程序(而不是工作进程)将文件放入 S3。如果可以,请尝试将上传内容加载到内存中,切勿将其写入磁盘并直接发布到 S3。这将提高您的上传速度。
因为 Heroku 托管在 AWS 上,所以到 S3 的流以非常高的速度发生。在本地开发时请记住这一点。
【讨论】: