2012-02-20 18 views
26

Tengo una aplicación donde cada entidad de DataStore de un tipo específico puede tener una cantidad de fotos asociadas a ella. (Imagine un sitio web de ventas de automóviles: un auto tiene varias fotos)Almacenar fotos en Blobstore o como blobs en Datastore - ¿Cuál es mejor/más eficiente/más barato?

Originalmente debido a que todos los datos proceden de otro sitio, estaba limitado a tener que almacenar las fotos como Blobs de almacén de datos, pero ahora es posible escribir BlobStore artículos programáticamente, me pregunto si debería cambiar mi diseño y almacenar las fotos como artículos BlobStore?

Entonces, la pregunta es: ¿Está
que 'mejor' para almacenar las fotos en el almacén de blob, o como gotas en el almacén de datos? Ambas son posibles soluciones, pero ¿cuál sería el enfoque mejor/más barato/más eficiente y por qué?

Respuesta

45

Imágenes sirve de almacén de blob tiene varias ventajas sobre el almacén de datos:

  1. se sirven imágenes directamente desde el almacén de blob, por lo que la solicitud no pasa por ejemplo frontend GAE. Así que está ahorrando en instancias frontend el tiempo y, por lo tanto, el costo.

  2. El costo de almacenamiento de BlobStore es aproximadamente la mitad del costo de almacenamiento del almacén de datos ($ 0.13 frente a $ 0.24). Con Datastore también pagaría por get() o query().

  3. BlobStore utiliza automáticamente el servicio de caché de Google, por lo que el único costo es el costo del ancho de banda ($ 0,12/GB). También puede configurar esto en la instancia de interfaz a través del control de caché, pero la diferencia es que esto se realiza automáticamente para BlobStore.

  4. Las imágenes en BlobStore se pueden servir a través de ImageService y pueden ser transformed on the fly, p. Ej. creando miniaturas Las imágenes transformadas también se almacenan en caché automáticamente.

  5. Las manchas binarias en Datastore están limitadas a 1Mb de tamaño.

Una desventaja de BlobStore es que no tiene controles de acceso. Cualquiera con una URL para blob puede descargarlo. Si necesita ACL (Lista de control de acceso) eche un vistazo a Google Cloud Storage.

Actualización:

Costo sabia el mayor ahorro vendrá de almacenamiento en caché correctamente las imágenes:

  1. Cada imagen debe tener una URL permanente.
  2. Cada URL de la imagen debe ser servido con cabeceras HTTP de control de caché apropiadas:

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

se puede hacer esto en Java a través de:

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

Actualización 2:

Como Dan señala correctamente en los comentarios, los datos de BlobStore se sirven a través de una interfaz en postura, por lo que los controles de acceso pueden implementarse por código de usuario.

+0

Gracias - ¡una gran respuesta! Creo que estaré mirando mis costos y veré si los costos reducidos de usar BlobStore justificarán el esfuerzo de programación de mover imágenes fuera de DataStore. –

+0

Dado que ya tiene imágenes en Datastore, puede reconsiderar simplemente agregar un encabezado de control de caché adecuado. El motor de aplicaciones usa sus propios cachés de bordes, por lo que las solicitudes de contenido correctamente almacenado en caché nunca llegan a su instancia. –

+0

¡Eso me ahorrará una carga de código! Encabezado adicional es entonces :) –

Cuestiones relacionadas