Google Cloud Datastore

      No hay comentarios en Google Cloud Datastore

Últimamente he estado ‘jugando’ con Google Cloud Datastore para probar cómo de util puede llegar a ser.

Lo primero que tengo que decir es que está en beta. Pero en esta ocasión no es como Gmail, que continuó siendo beta durante 5 años a pesar de ser un producto estable con un montón de usuarios. En esta caso el producto se encuentra realmente es un estado muy inicial y no pueden garantizar que no haya cambios que rompan la compatibilidad.

Una de esas cosas que cambiaron recientemente fue el protocolo usado en los clientes de ruby y node.js, ocasionando que el emulador existente que es parte del SDK de gcloud dejara de ser compatible como se explica en la documentación:

As of this release, the Datastore emulator that is part of the gcloud SDK is not compatible with gcloud-node. We usegRPC as our transport layer, while the gcloud SDK’s Datastore emulator does not support gRPC.

Use gcd.sh directly

For now, you must use the gcd.sh script.

Y como explican, empecé a usarlo. Hice un pequeño proyecto en el que importé gcloud definiendo los parámetros projectId y el apiEndpoint con los mismos valores que había dado al emulador y pude empezar a hacer la primera búsqueda:

Pero tener esos parámetros a fuego no me parecía demasiado limpio, así que después de mirar un poco más la documentación vi que podía reemplazarlos con variables de entorno. Primero borré apiEnpoint y ejecuté:

export DATASTORE_EMULATOR_HOST=localhost:8080

Y con eso establecido, todo continuaba funcionando como esperaba. Ten cuidado cuando borres apiEndpoint puesto que sin él y sin haber definido DATASTORE_EMULATOR_HOST, gcloud intentará conectarse usando las credenciales que por defecto hayas definido en tu instalación de gcloud.

A continuación borré projectId y exporté la variable de entorno definida en la documentación:
export DATASTORE_PROJECT_ID=testing-project

Pero… ups! Algo falló!

{ Error: Bad Request
at /Users/laura/testing-project/node_modules/grpc/src/node/src/client.js:417:17 code: 400, metadata: Metadata { _internal_repr: {} } }

Así que parece que el emulador no reconoce realmente ese parámetro, o quizás es un parámetro antiguo que reemplazaron. Tras continuar investigando y buscando más ejemplos encontré esta otra página de documentación en la que me percaté de que estaban usando una nueva variable de entorno, GCLOUD_PROJECT, así que intenté importar esta:

export GCLOUD_PROJECT=testing-project

Y después de eso, voilà, todo funcionaba de nuevo. En la página en la que encontré ese parámetro podemos ver que siguen definiendo projectId: process.env.GCLOUD_PROJECT así que puede ser que esa variable de entorno no se cargara automáticamente cuando la escribieron o que puede que deje de estar soportada en algún momento y por eso sugieren que nos encarguemos nosotros de establecer el valor de projectId a partir de la variable de entorno.

Con todo ya funcionando decidí crear una búsqueda más compleja que incluyera una igualdad y una desigualdad. En producción, de acuerdo con la documentación, necesitaremos crear primero el índice que contenga esos dos campos (los índices para búsquedas más sencillas como aquellas que solo contienen igualdades o únicamente contienen una desigualdad se crean automáticamente). Per si estamos usando el emulador, no fallará cuando intentemos ejecutar la búsqueda y creará el fichero index.yml definiendo el índice para así ayudarnos a crearlo luego en producción.

Así que creé mi código para leer los usuarios con un determinado nombre y mayores de una cierta edad:

Y cuando lo ejecuté, ¡me encontré con un nuevo error!

{ Error: Precondition Failed at /Users/laura/testing-project/node_modules/grpc/src/node/src/client.js:417:17 code: 412, metadata: Metadata { _internal_repr: {} } }

Malas noticias, la generación de índices parece que falla en la verisón del emulador que enlazan. Investigué un poco más hasta que me di cuenta de que si instalas gcloud en tu ordenador y listas todos los componentes, aparecen dos emuladores: Cloud Datastore Emulator (Legacy) y Cloud Datastore Emulator. Para ejecutar cualquiera de ellos es necesario tener el componente beta también instalado. Es necesario definir el id de proyecto con gcloud config set project VALUE o definiendo la variable de entorno CLOUDSDK_CORE_PROJECT. El comando que usé para ejecutar el emulador finalmente fue:

gcloud beta emulators datastore start --host-port=localhost:8888 --no-legacy

El parámetro –no-legacy resultó ser muy importante dado que es la forma que tenemos de decirle a gcloud que queremos usar el nuevo emulador en lugar del antiguo. El otro parámetro strong>–host-port, lo tuve que usar porque no encontré ninguna forma de indicar únicamente el puerto y quería asegurarme de que siempre se ejecuta en un mismo puerto conocido.

Tras ejecutar nuevamente mi búsqueda pude finalmente encontrar en el directorio de configuración mi fichero index.yaml (en mi caso /Users/laura/.config/gcloud/emulators/datastore/WEB-INF/index.yaml) que tenía esta pinta:

Y tras todos esos tests, ¡conseguí por fin tener un entorno que funcionara con un emulador!¡El siguiente paso será pasar a un entorno real!

Mi conclusión es que parece una herramienta muy prometedora, ¡pero quizás es aún un poco pronto para ella!

Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedInEmail this to someone

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *