2012-01-30 15 views
5

Nunca crearía suficientes entidades para quedarme sin espacio de direcciones de 63 bits, pero digo que utilicé allocateIdRange para asignar el id 9223372036854775807 (que es casi 2^63). ¿Es ese tipo de entidad simplemente rota para entidades nuevas, ingresadas automáticamente?¿Qué puedo esperar cuando me quedo sin identificaciones en AppEngine?

Probé esto en una aplicación de prueba. Parece que algunos fragmentos del auto IDer pueden continuar produciendo identificadores válidos, pero otros fragmentos simplemente dan un DatastoreFailureException. La tasa de éxito es de aproximadamente 30%. ¿Alguna vez subirá?

Esto es realmente una pregunta seria porque, en mi ingenuidad, creé algunos ids bastante grandes. Todavía tengo varios billones de entidades por recorrer antes de llegar a este límite, pero me he dado cuenta de que los identificadores pueden saltar por millones entre las entidades, y entro entidades nuevas a un ritmo de alrededor de un millón por año. Entonces ... tengo miedo de alcanzar este límite.

+0

Puede usar la identificación incremental y no debería ser un problema –

+0

Gracias por su respuesta. ¿Cómo puedo usar ID incremental? En mis pruebas, la asignación predeterminada que appengine deja de funcionar. –

+3

Mientras no crees ningún ID más grande, creo que estarás bien. Creo que las brechas entre los identificadores provienen de restablecimientos en los contadores locales utilizados para asignar identificadores. Puedes imaginar cómo funciona: varios fragmentos del almacén de datos usan el equivalente interno de allocate_ids para solicitar, p. 100 identificadores y luego entregarlos a las nuevas entidades; si se destruye un fragmento, todos los identificadores que no se distribuyeron se reservarán para siempre. Estoy generando nuevas identidades a un ritmo de un millón por año. Creo que la mayoría de los fragmentos pueden entregar muchos identificadores antes de que mueran. Puede muestrear los ids por un mes y predecir la tasa. –

Respuesta

2

Con una aplicación de prueba, reservé un montón de identificadores muy altos con allocateIdRange. Al principio, aproximadamente la mitad de mis intentos de poner nuevas entidades tuvieron éxito. Ahora, no nuevas entidades se pueden poner con un id en blanco - un DatastoreFailureException se levanta cada vez. Supongo que esto se debe a que la implementación del asignador clave no hace un seguimiento de las lagunas en las claves, sino que solo hace un seguimiento de la identificación más alta que se haya dado hasta el momento.

No veo ninguna forma de restablecer el contador para este tipo, así que creo que la única solución sería elegir un nuevo nombre Kind.

Lección: no use IDs en ningún lugar cerca de 2^63!

Cuestiones relacionadas