2012-02-20 79 views
26

我有一個應用程序,其中一個特定種類的每個數據存儲實體可以有許多與之相關的照片。 (想象一下一個汽車銷售網站 - 一輛車有多張照片)儲存相片Blob存儲或斑點在數據存儲 - 這是更好/更高效/更便宜的?

由於所有的數據都來自另一個網站,我只能將這些照片存儲爲DataStore Blob,但現在可以編寫BlobStore項目編程,我想知道如果我應該改變我的設計,並將照片存儲爲BlobStore項目?

因此,問題是:
將照片存儲在Blobstore中,或作爲Blob存儲在數據存儲區中是「更好」嗎?兩者都是可能的解決方案,但是這將是更好/更便宜/最有效的方法,爲什麼?

回答

45

圖像從Blob存儲服務有幾個優點在數據存儲:

  1. 圖像直接從供應Blobstore的,所以要求不經過GAE前端實例。所以你要節省前端實例的時間和成本。

  2. BLOBSTORE存儲成本大約是數據存儲的存儲成本($ 0.13 VS $ 0.24)的一半。使用Datastore,您還需要支付get()或query()。

  3. BLOBSTORE自動使用谷歌的緩存服務,所以唯一的成本就是帶寬的成本($ 0.12/GB)。您也可以通過緩存控制將其設置在前端實例上,但不同之處在於,這是針對BlobStore自動完成的。在BLOBSTORE

  4. 圖像可以經由ImageService送達,並且可以是transformed on the fly,例如創建縮略圖。轉換後的圖像也會自動緩存。在數據存儲

  5. 的二進制塊被限制爲1MB大小。

BlobStore的一個缺點是它沒有訪問控制。任何有blob網址的人都可以下載它。如果您需要ACL(訪問控制列表),請查看Google Cloud Storage

更新:

成本方面最大的節省將來自正確緩存圖片:

  1. 每一個形象,應該有一個永久的URL。
  2. 每個圖像URL應以適當的緩存控制HTTP頭送達:

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

    更新2:

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

您可以通過在Java中做到這一點

正如Dan在評論中正確指出的那樣,BlobStore數據通過前端立場,所以訪問控制可以通過用戶代碼來實現。

+0

感謝 - 一個偉大的答案!我想我會看看我的成本,看看使用BlobStore的成本降低是否能證明將圖像移出DataStore的編程工作是合理的。 – 2012-02-20 14:43:48

+0

由於數據存儲區中已經有圖像,因此您可能會重新考慮添加適當的緩存控制標題。 App引擎使用它自己的邊緣緩存,因此正確緩存內容的請求永遠不會到達您的實例。 – 2012-02-20 15:44:26

+0

這會爲我節省一大筆代碼!額外的頭然後:) – 2012-02-20 16:02:19

相關問題