【问题标题】:Store Photos in Blobstore or as Blobs in Datastore - Which is better/more efficient /cheaper?将照片存储在 Blobstore 中或作为 Blob 存储在 Datastore 中 - 哪个更好/更高效/更便宜?
【发布时间】:2012-02-20 13:34:05
【问题描述】:

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

最初由于所有数据都来自另一个站点,我仅限于将照片存储为 DataStore Blob,但现在可以以编程方式编写 BlobStore 项目,我想知道是否应该更改我的设计和将照片存储为 BlobStore 项?

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

【问题讨论】:

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


    【解决方案1】:

    从 BlobStore 提供的图像与 Datastore 相比有几个优势:

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

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

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

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

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

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

    更新:

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

    1. 每张图片都应该有一个永久的 URL。
    2. 每个图像 URL 都应该使用适当的缓存控制 HTTP 标头:

      // 32M seconds is a bit more than one year 
      Cache-Control: max-age=32000000, must-revalidate
      

    您可以通过以下方式在 java 中执行此操作:

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

    更新 2:

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

    【讨论】:

    • 谢谢 - 一个很好的答案!我想我会看看我的成本,看看使用 BlobStore 降低的成本是否可以证明将图像移出 DataStore 的编程工作是合理的。
    • 由于您已经在 Datastore 中有图像,您可能会重新考虑添加适当的缓存控制标头。应用引擎使用它自己的边缘缓存,因此对正确缓存内容的请求永远不会到达您的实例。
    • 彼得的回答很好,但请重新考虑访问控制警告。 Blobstore 值在应用程序管理的 URL 上提供,而不是在它们自己的公共 URL 上提供。用户请求发送到应用程序,应用程序通过将 Blobstore 键添加到响应标头来提供值,该响应标头被前端拦截。因此,该应用完全有机会决定不向给定用户提供价值。
    • @Peter:嗯,不,实际上,您从 Blobstore 中提供值的方式是接受对应用程序的请求,然后使用带有密钥的 X-AppEngine-BlobKey 标头进行响应。 App Engine 拦截传出响应,并用直接从服务流式传输的 Blobstore 值替换正文。因为应用程序逻辑首先设置了标头,所以应用程序可以实现它想要的任何访问控制。没有默认 URL 可以直接从 Blobstore 中提供值而无需应用程序干预。也许你在想别的东西?
    • @Dan,你是对的。 Blobstore 请求通过前端实例进行。我将它与产生重定向的 ImageService 混合使用,最终 URL 位于 Google CDN 上,无需前端实例即可访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2020-06-18
    • 2010-09-17
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多