将照片存储在Blobstore中或作为数据存储区中的Blob存储 - 哪个更好/更高效/更便宜?

时间:2012-02-20 13:34:05

标签: google-app-engine google-cloud-datastore blobstore

我有一个应用程序,其中每个特定类型的DataStore实体可以有许多与之关联的照片。 (想象一下汽车销售网站 - 一辆车有多张照片)

最初由于所有数据都是从其他网站获取的,因此我只能将照片存储为DataStore Blob,但现在可以以编程方式编写BlobStore项目,我想知道是否应该更改我的设计和将照片存储为BlobStore项目?

所以,问题是:
将照片存储在Blobstore中,还是作为数据存储区中的Blob“更好”?两者都是可能的解决方案,但这将是更好/更便宜/最有效的方法,为什么?

1 个答案:

答案 0 :(得分:46)

从BlobStore提供的图像比数据存储有几个优点:

  1. 图像直接从BlobStore提供,因此请求不会通过GAE前端实例。所以你节省了前端实例的时间,从而节省了成本。

  2. BlobStore存储成本大约是数据存储存储成本的一半(0.13美元对0.24美元)。使用数据存储区,您还需要为get()或query()付费。

  3. BlobStore会自动使用Google缓存服务,因此唯一的成本是带宽成本(0.12美元/ GB)。您也可以通过缓存控制在前端实例上设置它,但区别在于这是为BlobStore自动完成的。

  4. BlobStore中的图片可以通过ImageService提供,可以是transformed on the fly,例如创建缩略图。转换后的图像也会自动缓存。

  5. 数据存储区中的二进制blob限制为1Mb。

  6. BlobStore的一个缺点是它没有访问控制。任何拥有blob URL的人都可以下载它。如果您需要ACL(访问控制列表),请查看Google Cloud Storage

    <强>更新

    成本方面,最大的节省将来自正确缓存图像:

    1. 每张图片都应有永久网址。
    2. 每个图片网址都应该提供适当的缓存控制HTTP标头:

      // 32M seconds is a bit more than one year 
      Cache-Control: max-age=32000000, must-revalidate
      
    3. 您可以通过以下方式在java中执行此操作:

      httpResponse.setHeader("Cache-Control", "max-age=32000000, must-revalidate");
      

      更新2:

      正如Dan在评论中正确指出的那样,BlobStore数据是通过前端实例提供的,因此访问控制可以通过用户代码实现。