2012-02-13 21 views
5

Tengo un trabajo de larga ejecución que actualiza 1000 de grupos de entidades. Quiero comenzar un segundo trabajo después que tendrá que suponer que todos esos elementos se han actualizado. Debido a que hay tantos grupos de entidades, no puedo hacerlo en una transacción, así que acabo de programar el segundo trabajo para que se ejecute 15 minutos después de que termine el primer uso de las colas de tareas.¿Cómo saber cuándo se completó la actualización del almacén de datos de Google AppEngine HRD?

¿Hay una manera mejor?

¿Es seguro suponer que 15 minutos prometen que el almacén de datos está sincronizado con mis llamadas anteriores?

Estoy usando alta replicación.

En los videos de Google IO sobre HRD, ofrecen una lista de formas de lidiar con la coherencia final. Uno de ellos fue "aceptarlo". Algunas actualizaciones (como las publicaciones de Twitter) no necesitan ser consistentes con la próxima lectura. Pero también dijeron algo así como "hey, solo estamos hablando de milisegundos en un par de segundos antes de que sean consistentes". ¿Ese marco de tiempo está documentado en otro lugar? ¿Es seguro asumir que esperar 1 minuto después de escribir antes de volver a leer significará que todas mis escrituras previas están allí en la lectura?

La mención de que es en la marca de 39:30 en este video http://www.youtube.com/watch?feature=player_embedded&v=xO015C3R6dw

+0

He dado una respuesta parcial a continuación, pero ¿puede darme más información sobre lo que está tratando de hacer exactamente? – mjaggard

+0

Básicamente estoy insertando o actualizando miles de entidades. Cuando ese trabajo esté completo, necesito aplicar un rango a los artículos. Así que ejecuto una consulta que selecciona todos los registros y los ordena por el campo que me preocupa por el ranking. Luego actualizo los rangos en otro tipo de entidad. Ese rango obviamente estará desactivado si las entidades faltan en la consulta. – user963263

Respuesta

0

encontré esta declaración:

Con consistencia eventual, más del 99,9% de sus escrituras están disponibles para las consultas a los pocos segundos.

en la parte inferior de esta página: http://code.google.com/appengine/docs/java/datastore/hr/overview.html

Por lo tanto, para mi aplicación, una oportunidad 0,1% de que no fuera allí en la próxima lectura es probablemente correcto. Sin embargo, planeo rediseñar mi esquema para hacer uso de consultas de antecesores.

0

No creo que haya ninguna construido en forma de determinar si se realizan las actualizaciones. Recomendaría agregar un campo lastUpdated a sus entidades y actualizarlo con su primer trabajo, luego verifique la marca de tiempo en la entidad que está actualizando con el 2do antes de ejecutar ... una especie de truco, pero debería funcionar.

Interesado para ver si alguien tiene una mejor solución. Espero que lo hagan ;-)

0

Esto es automático siempre y cuando consigas entidades sin cambiar la coherencia a Eventual. El HRD coloca los datos en la mayoría de los servidores de datos relevantes antes de volver. Si llama a la versión asíncrona de put, deberá llamar a get en todos los objetos Future para asegurarse de que esté completa.

Sin embargo, si está consultando los artículos en el primer trabajo, no hay manera de asegurarse de que el índice se haya actualizado.

Así, por ejemplo ...

Si está actualizando una propiedad en cada entidad (pero no la creación de cualquier entidad), a continuación, recuperar todas las entidades de ese tipo. Puede hacer una consulta de solo teclas seguida de un lote (que es aproximadamente tan rápido/barato como hacer una consulta normal) y asegúrese de tener todas las actualizaciones aplicadas.

Por otro lado, si agrega nuevas entidades o actualiza una propiedad en el primer proceso que consulta el segundo proceso, no hay forma de estar seguro.

+0

Mi primer proceso actualiza y crea nuevas entidades. Por lo tanto, no hay forma de estar seguro de que las entidades estarán presentes en una llamada inmediata para leer esos mismos elementos del almacén de datos sin importar cuánto tiempo espere para ejecutar el segundo proceso (15 minutos o 15 días)? – user963263

+0

Depende de lo que quieras decir con "leer": si te refieres a "obtener", entonces sí, siempre estarán ahí. Sin embargo, si quiere decir "consulta" o "buscar", entonces no. Sin embargo, podría hacer una consulta de solo teclas para cada entidad que haya agregado, permitiendo solo que el segundo proceso se ejecute una vez que cada entidad agregada esté presente en el resultado de una consulta. – mjaggard

+0

Quiere decir persistir o actualizar miles de elementos y mantener sus claves en la memoria. Entonces, cuando los leí de nuevo a través de una consulta, asegúrese de que todas las claves estén presentes en los resultados. Si están presentes, ¿está garantizado que los datos estarán sincronizados con las actualizaciones que se ejecutaron segundos antes? Incluso si ese es un enfoque válido, en algún momento mis 1,000 se convertirán en 1,000,000 y me gustaría evitar almacenar tantos datos en la memoria. En este momento estoy evitando eso usando cursores y solo operando en unos 100 elementos a la vez. – user963263

Cuestiones relacionadas