2012-01-19 9 views
6

Estoy un poco confundido sobre 'Grupos de entidades' en el Datastore de replicación alta de Google App Engine (HRD). La documentación de Google menciona que HRD solo permite 1 escritura por segundo por grupo de entidades.Organización de grupos de entidades en Google App Engine para escribir

¿Qué significa exactamente esto? ¿Es esto 1 escritura por solicitud de usuario o 1 escritura por entidad (que supongo que es un concepto similar a una "tabla").

Por ejemplo, si tengo una entidad "Usuario" y una tabla "Publicar". Si "Post" es un antepasado del "Usuario":

  1. ¿Quiere decir esto que uno "usuario" puede crear una "Post" por segundo
  2. ... o significa todas las escrituras en la entidad "Publicación" están restringidas a 1 escritura por segundo, independientemente del Usuario? (es decir, el sistema solo puede guardar 1 publicación al mismo tiempo, independientemente del número de usuarios que envíen publicaciones)
  3. ... o significa que una sola entidad "Usuario" no puede crear más de 1 "Publicación" al mismo tiempo (incluso si miles de otros usuarios se crean entidades "Post")?

¿Cuáles son mis opciones para mitigar esto? ¿Es razonable crear entidades raíz "Usuario" y "Publicar"? ¿Esto me permitirá crear varias instancias "Post" fuera de la restricción de 1 escritura por segundo? Quiero evitar cualquier posible problema si, por ejemplo, 1000 usuarios debían crear entradas "Post" al mismo tiempo.

Respuesta

8

"grupo de entidades" es no como "table." No hay nada que signifique "tabla" en el almacén de datos appengine. Deberías pensar solo en términos de entidades e índices.

Solo utiliza grupos de entidades cuando desea poder realizar operaciones de forma transaccional. En el caso de un blog con "Publicaciones", probablemente no importe si agrega o quita publicaciones de forma transaccional, por lo que NO es necesario que estén en un grupo de entidades.

Tengo alrededor de 15 tipos diferentes de entidades en mi aplicación, y alrededor de 1.5M de ellas. Cada una de ellas es una entidad raíz, incluso las relacionadas, y creo que esto es ideal para AppEngine. Por lo que puedo decir, el ÚNICO objetivo de los grupos de entidades es apoyar operaciones atómicas en múltiples entidades, no son una herramienta de organización.

PD: en cuanto a sus preguntas acerca de las restricciones del Grupo de entidades (que creo que serán en su mayoría discutibles ahora): el límite de escritura es por entidad, no por solicitud. 1. Las entidades no crean otras entidades. 2. Si todas las Publicaciones estuvieran en el mismo grupo de entidades, entonces sí, solo podría guardar 1 por segundo. 3. Si cada usuario estuviera en su propio grupo de entidades, podría escribir 1 publicación en cada grupo al mismo tiempo, tantas veces por segundo como desee. Es solo que no se puede escribir un solo grupo más de una vez por segundo. Sí, creo que "Usuario" y "Publicar" deberían ser entidades raíz.

+0

¡Respuesta fantástica! Muchas gracias por la aclaración. Como nota al margen (dada su experiencia); ¿Cómo cree que se beneficia HRD en comparación con el uso de almacenes de datos externos como MongoDB o AWS DynamoDB? –

+2

¡De nada! No tengo experiencia con almacenes de datos externos. Es difícil imaginar que la latencia de cualquier tienda externa no supere a otros beneficios de rendimiento que puedan tener. Sin embargo, podría imaginar los beneficios de las características ... –

+2

Solo una aclaración, el límite es para escrituras distintas en un grupo de entidades, pero puede escribir múltiples entidades dentro del grupo con una sola llamada. Ver esto [Google IO talk] (http://www.google.com/events/io/2011/sessions/more-9s-please-under-the-covers-of-the-high-replication-datastore.html) . –

1

El uso de grupos de entidades también hace que sus datos dentro del grupo sean muy consistentes.

Por ejemplo, sin grupos de entidades, si crea una publicación y luego navega rápidamente a la lista de publicaciones recientes, es posible que no vea su nueva publicación inmediatamente. Para un blog, eso puede no ser un problema.

Pero si está haciendo un sistema de administración de tareas ... va a una pantalla de detalles de la tarea, cierra la tarea y esto lo lleva de regreso a la lista de tareas, la tarea aún puede aparecer como abierta. Eso no es aceptable.Aquí, necesitaría grupos de entidades o algún otro medio para hacer que la lista de tareas sea coherente para el usuario actual.

En algunos modelos de datos, es fácil crear grupos de entidades. Por ejemplo, hacer que las tareas formen parte de un grupo de proyectos resolvería el problema asumiendo que solo se pueden mostrar tareas para un solo grupo. Si su UI permite enumerar tareas de múltiples grupos, es más difícil encontrar un modelo que funcione.