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

Joe*_*rne 26 google-app-engine blobstore google-cloud-datastore

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

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

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

Pet*_*ego 46

从BlobStore提供的图像比Datastore有几个优点:

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

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

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

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

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

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

更新:

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

  1. 每个图像都应该有一个永久URL.
  2. 应为每个图像URL提供适当的缓存控制HTTP标头:

    // 32M seconds is a bit more than one year 
    Cache-Control: max-age=32000000, must-revalidate
    
    Run Code Online (Sandbox Code Playgroud)

你可以在java中做到这一点:

httpResponse.setHeader("Cache-Control", "max-age=32000000, must-revalidate");
Run Code Online (Sandbox Code Playgroud)

更新2:

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

  • 彼得很好的回答,但请重新考虑访问控制警告.Blobstore值在应用程序管理的URL上提供,而不是在他们自己的公共URL上提供.用户请求转到应用程序,应用程序通过将Blobstore密钥添加到响应标头来提供该值,该标头由前端拦截.因此,应用程序有机会决定不为给定用户提供价值. (6认同)
  • @Peter:呃,不,实际上,你从Blobstore中提供一个值的方式是接受对应用程序的请求,然后使用密钥响应X-AppEngine-BlobKey头.App Engine拦截传出响应,并使用直接从服务流式传输的Blobstore值替换正文.由于应用程序逻辑首先设置标头,因此应用程序可以实现它想要的任何访问控制.没有应用程序干预,没有默认URL直接在Blobstore之外提供值.也许你在想别的什么? (4认同)