2011-05-30 10 views
14

Soy un novato total de App Engine, y quiero confirmar mi comprensión del almacén de datos de alta replicación.Almacén de datos de replicación alta de App Engine

La documentación dice que los grupos de entidades son una "unidad de consistencia" y que todos los datos son eventualmente consistentes. En la misma línea, también dice que "las consultas entre los grupos de entidades pueden ser obsoletas".

¿Alguien puede dar algunos ejemplos donde las consultas pueden ser "obsoletas"? ¿Está diciendo que podría potencialmente salvar una entidad sin un padre (es decir, su propio grupo), luego buscarla muy pronto y no encontrarla? ¿También implica que si quiero que los datos estén siempre al 100% actualizados, necesito guardarlos todos en el mismo grupo de entidades?

¿Es la solución común para esto el uso de Memcache para almacenar en caché las entidades durante un período de tiempo mayor que el tiempo promedio que tardan los datos en ser coherentes en todos los centros de datos? ¿Cuál es la latencia del estadio para eso?

Gracias

Respuesta

18

está diciendo que podía potencialmente ahorrar una entidad sin cualquier padre (es decir. Que es propio grupo), a continuación, consulte para que sea muy poco después y no lo encuentra?

Correcto. Técnicamente, este también es el caso del almacén de datos Maestro-Esclavo habitual, ya que los índices se actualizan de forma asíncrona, pero en la práctica la ventana de tiempo en que eso podría suceder es tan increíblemente pequeña que nunca la ves.

Si por "consulta" quiere decir "hacer una obtención por clave", eso siempre devolverá resultados consistentes en cualquiera de las implementaciones.

lo hace también implica que si quiero datos sean siempre 100% al día necesito Guardar todos ellos en el mismo grupo de entidades ?

Tendrá que definir lo que quiere decir con "100% actualizado" antes de que sea posible responder eso.

¿Está la solución común para este uso a Memcache para almacenar en caché entidades por un período de tiempo más largo que el promedio tiempo necesario para que los datos se conviertan en consistente en todos los centros de datos?

No. Memcache es estrictamente para mejorar los tiempos de acceso; no deberías usarlo en ninguna situación en la que el desalojo del caché cause problemas.

Obtiene resultados consistentes siempre disponibles si necesita garantizar que está viendo la última versión. Sin embargo, sin un ejemplo concreto de lo que intenta hacer, es difícil ofrecer una recomendación.

+1

Lo siento, realmente no tengo un ejemplo concreto. Intento aprender el sistema para poder comenzar a trabajar en mi proyecto. Solo quiero poder almacenar datos en el almacén de datos y recuperar la última versión cuando la necesite. Solo intento descubrir cuándo no es así y cómo puedo garantizar que cuando solicite un resultado obtendré el más reciente. Por "consulta" quise hacer una consulta por propiedad como lo haría en SQL, no por clave. Solo quiero entender lo que quieren decir con grupos antepasados ​​es una "unidad de consistencia" y qué puede ser "inconsistente". – amatsukawa

+0

Nick, en la sección Notas de uso de este documento: http://code.google.com/intl/es/appengine/docs/python/datastore/hr/overview.html dice que "puede poner publicaciones recientes en Memcache con una caducidad, y luego mostrar una mezcla de las publicaciones recientes de Memcache y las publicaciones recuperadas del almacén de datos ". – fjsj

+0

@ user439383 (¿Has considerado establecer un nombre de usuario más útil?) Personalmente, dejaría de preocuparte por esto hasta que, a menos que tengas un caso específico, sea motivo de preocupación. Eventualmente, la semántica coherente está bien para la mayoría de las situaciones, y sabrá cuándo necesita una fuerte consistencia. –

11

configuración del ejemplo del blog obligatorio; Authors tienen Posts

class Author(db.Model): 
    name = db.StringProperty() 

class Post(db.Model): 
    author = db.ReferenceProperty() 
    article = db.TextProperty() 

bob = Author(name='bob') 
bob.put() 

primero que hay que recordar es que el uso regular get/put/delete en un solo grupo de entidades (incluyendo sola entidad) funcionará como se espera:

post1 = Post(article='first article', author=bob) 
post1.put() 

fetched_post = Post.get(post1.key()) 
# fetched_post is latest post1 

Sólo se podrán aviso inconstancia si comienza a consultar en múltiples grupos de entidades. A menos que haya especificado un atributo parent, todas sus entidades están en grupos de entidades separadas. Así que si era importante que inmediatamente después de bob crea una entrada, que puede ver allí propio puesto entonces debemos tener cuidado con lo siguiente:

fetched_posts = Post.all().filter('author =', bob).fetch(x) 
# fetched_posts _might_ contain latest post1 

fetched_postsfuerza contienen la última post1 de bob, pero podría no. Esto se debe a que todos los Posts no están en el mismo grupo de entidades. Al hacer una consulta como esta en HR debes pensar "tráeme probablemente las últimas publicaciones de bob".

Dado que es importante en nuestra aplicación que el autor pueda ver su publicación en la lista inmediatamente después de crearla, usaremos el atributo parent para unirlas, y usaremos una consulta ancestor para obtener las publicaciones solo desde ese grupo:

post2 = Post(parent=person, article='second article', author=bob) 
post2.put() 

bobs_posts = Post.all().ancestor(bob.key()).filter('author =', bob).fetch(x) 

Ahora saben que post2 estará en nuestros resultados bobs_posts.

Si el objetivo de nuestra consulta era buscar "probablemente todas las últimas publicaciones + definitivamente las últimas publicaciones de bob" tendríamos que hacer otra consulta.

other_posts = Post.all().fetch(x) 

y luego fusionar los resultados other_posts y bobs_posts juntos para conseguir el resultado deseado.

+0

Esta es una gran explicación en realidad. Lo único que no entiendo es ¿qué es 'persona' en tu ejemplo? Una clase o instancia? – Houman

5

Al haber migrado mi aplicación desde el Maestro/Esclavo al almacén de datos de Alta Replicación, debo decir que en la práctica, la consistencia final no es un problema para la mayoría de las aplicaciones.

Considere el ejemplo clásico de libro de visitas, donde put() una nueva entidad de publicación de libro de visitas y luego consulte de inmediato todas las publicaciones en el libro de visitas. Con el almacén de datos de alta replicación, no verá la nueva publicación aparecer en los resultados de la consulta hasta unos segundos más tarde (en Google I/O, los ingenieros de Google dijeron que el retraso era del orden de 2-5 segundos).

Ahora, en la práctica, su aplicación de libro de visitas probablemente esté haciendo una publicación AJAX de la nueva entrada de la publicación del libro de visitas. No es necesario volver a buscar todas las publicaciones después de enviar la nueva publicación. La aplicación web puede simplemente insertar la nueva entrada en la interfaz de usuario una vez que la solicitud AJAX haya tenido éxito. Para cuando el usuario abandone la página web y regrese a ella, o incluso presione el botón de actualización del navegador, habrán transcurrido varios segundos, y es muy probable que la nueva consulta regrese todas las publicaciones del libro de visitas.

Finalmente, tenga en cuenta que el rendimiento de coherencia eventual solo se aplica a las consultas .Si put() es una entidad e inmediatamente llama al db.get() para recuperarla, el resultado es muy consistente, es decir, obtendrá la última instantánea de la entidad.

Cuestiones relacionadas