我有一个应用程序,其中每个特定类型的DataStore实体可以有许多与之关联的照片。 (想象一下汽车销售网站 - 一辆车有多张照片)
最初由于所有数据都是从其他网站获取的,因此我只能将照片存储为DataStore Blob,但现在可以以编程方式编写BlobStore项目,我想知道是否应该更改我的设计和将照片存储为BlobStore项目?
所以,问题是:
将照片存储在Blobstore中,还是作为数据存储区中的Blob“更好”?两者都是可能的解决方案,但这将是更好/更便宜/最有效的方法,为什么?
答案 0 :(得分:46)
从BlobStore提供的图像比数据存储有几个优点:
图像直接从BlobStore提供,因此请求不会通过GAE前端实例。所以你节省了前端实例的时间,从而节省了成本。
BlobStore存储成本大约是数据存储存储成本的一半(0.13美元对0.24美元)。使用数据存储区,您还需要为get()或query()付费。
BlobStore会自动使用Google缓存服务,因此唯一的成本是带宽成本(0.12美元/ GB)。您也可以通过缓存控制在前端实例上设置它,但区别在于这是为BlobStore自动完成的。
BlobStore中的图片可以通过ImageService提供,可以是transformed on the fly,例如创建缩略图。转换后的图像也会自动缓存。
数据存储区中的二进制blob限制为1Mb。
BlobStore的一个缺点是它没有访问控制。任何拥有blob URL的人都可以下载它。如果您需要ACL(访问控制列表),请查看Google Cloud Storage。
<强>更新强>
成本方面,最大的节省将来自正确缓存图像:
每个图片网址都应该提供适当的缓存控制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在评论中正确指出的那样,BlobStore数据是通过前端实例提供的,因此访问控制可以通过用户代码实现。