Compila aplicaciones web escalables con Cloud Datastore

En este artículo, se presenta una descripción general de cómo compilar aplicaciones web grandes con Datastore, un sistema de base de datos NoSQL escalable, completamente administrado, con alta disponibilidad y de alto rendimiento. En el artículo, se incluyen situaciones de aplicaciones web completas que usan Datastore junto con otros productos del ecosistema de Google Cloud (GCP).

Los administradores de infraestructura que administran los sistemas de base de datos para aplicaciones web grandes enfrentan importantes desafíos. En particular, los cambios de configuración pueden ser complejos y riesgosos cuando surgen situaciones imprevistas debido a la naturaleza de estado de esos sistemas de base de datos. Antes de lanzar una nueva aplicación, los administradores deben dedicar mucho tiempo a planificar la capacidad, la cantidad de máquinas virtuales (VM), la cantidad de almacenamiento en disco y la configuración de red con la que se logrará la máxima capacidad de procesamiento y la latencia mínima. Este tipo de planificación es desafiante porque hay muchos factores desconocidos, incluidos el volumen y la frecuencia de las conexiones de base de datos abiertas y la evolución de los patrones de uso en el tiempo. El trabajo de mantenimiento regular también es necesario a fin de actualizar el software de la base de datos y escalar los recursos para satisfacer la creciente demanda.

Toda esta planificación y mantenimiento te quita tiempo, dinero y atención que podrías usar para el desarrollo de nuevas funciones de aplicaciones, por lo que es importante encontrar un equilibrio entre aprovisionar los recursos suficientes para manejar cargas pesadas y gastar de forma excesiva en recursos sin uso. Datastore puede ayudar a minimizar estos desafíos para que los administradores de infraestructura puedan enfocarse en la aplicación.

Casos prácticos de Datastore

En un nivel alto, Datastore es más adecuado para almacenar datos transaccionales jerárquicos con un esquema flexible y no relacional. En particular, se recomienda usar Datastore si la aplicación web requiere alguna de las siguientes opciones:

  • Gran capacidad de almacenamiento: Datastore no limita la cantidad de datos almacenados. Maneja distintas cantidades de la misma manera, desde kilobytes hasta petabytes, sin afectar el rendimiento.
  • Cumplimiento con la atomicidad, la coherencia, el aislamiento y la durabilidad (ACID): Datastore admite transacciones de varios documentos que cumplen con la ACID.
  • Coherencia equilibrada: Datastore ofrece el equilibrio adecuado entre coherencia eventual y sólida. Las consultas de principales y las búsquedas de entidades por clave poseen siempre una coherencia sólida, mientras que todas las demás consultas tienen una coherencia eventual.
  • Indexación: Además de los índices principales, Datastore admite índices compuestos y secundarios.
  • Multiusuario: Datastore admite bases de datos de varios usuarios, ya que proporciona particiones de datos independientes, denominadas espacios de nombres, para organizaciones de varios clientes.
  • Ajuste de escala automático: Datastore escala verticalmente hasta decenas de miles de máquinas automáticamente y sin tiempo de inactividad. Este mecanismo de escalamiento, que se probó en App Engine por más de 10 años, permite que Datastore entregue millones de solicitudes por segundo. Los clientes solo pagan por el uso real según el tamaño de almacenamiento y la cantidad de operaciones. Para obtener más información, consulta los precios de Datastore.
  • Seguridad: Datastore encripta todos los datos automáticamente antes de que se escriban en el disco. Datastore también ofrece administración de identidades y accesos (IAM), que puedes usar para que haya acceso detallado a recursos específicos y evitar el acceso no deseado a otros recursos.
  • Redundancia: Datastore ofrece dos niveles de redundancia basados en dos tipos de replicación en varias ubicaciones:

    • Replicación regional: Los datos se replican en al menos tres zonas diferentes dentro de la misma región, lo que hace que la base de datos sea resistente a las interrupciones por zona. Este tipo de replicación es ideal si tu prioridad principal es lograr una latencia de escritura baja, en cuyo caso puede que desees ubicar las máquinas de procesamiento de tu aplicación en la misma región.
    • Replicación en múltiples regiones: los datos se replican en múltiples zonas en al menos dos regiones diferentes, lo que genera una mayor disponibilidad y redundancia. Sin embargo, también genera una mayor latencia de escritura. Un nodo testigo se implementa en una tercera región para que resuelva igualdades entre las dos regiones replicadas, como se ilustra en el siguiente diagrama.

Esquema de replicación de una base de datos multirregional en Datastore

Figura 1. Esquema de replicación de una base de datos multirregional en Datastore

La capacidad de Datastore de cumplir con todos los requisitos anteriores lo convierte en una buena opción para una amplia gama de casos prácticos, incluidos los siguientes:

  • Perfiles de usuario para personalizar la experiencia del usuario según sus actividades y preferencias pasadas. Con el esquema flexible de Datastore, puedes desarrollar la estructura de los perfiles de usuarios a lo largo del tiempo; por ejemplo, puedes agregar propiedades nuevas para admitir funciones nuevas en la aplicación. Los cambios en los esquemas no suponen tiempos de inactividad y no se reduce el rendimiento aun cuando aumenta la cantidad de usuarios.
  • Inventarios en tiempo real, como los catálogos de productos para un minorista. Puedes usar las entidades anidadas y enriquecidas de Datastore para almacenar grandes cantidades de datos dispersos y no homogéneos de diversos productos sin necesidad de especializar demasiado la estructura.
  • Administración de sesiones de usuario, por ejemplo, para carritos de compras en comercios minoristas o un formulario de procesamiento de varias partes que se usa a fin de reservar eventos. La compatibilidad de Datastore con las transacciones de ACID ayuda a garantizar que los usuarios puedan bloquear ciertos elementos durante un período hasta que se complete la transacción.
  • Mutaciones de estado, como en los videojuegos, a fin de mantener un estado coherente para todos los jugadores. Puedes usar las transacciones de ACID de Datastore para propagar las mutaciones en una gran cantidad de usuarios simultáneos. Si quieres obtener un ejemplo específico, consulta Clasificación rápida y confiable en Datastore para ver un servicio de juego grande.
  • Una caché persistente con el método “write-through” o de escritura inmediata, como un almacén clave-valor fácil de usar. Puedes usar la alta disponibilidad y la durabilidad de Datastore para mantener el estado y evitar la pérdida de datos en caso de que se produzca una falla de la aplicación.

Opciones de almacenamiento alternativas

Cuando evalúes Datastore como una posible solución de base de datos, asegúrate de que los límites de producción sean aceptables para los requisitos de la aplicación. Si bien Datastore es versátil y aplicable en muchos casos, otras opciones de almacenamiento en GCP pueden ser más adecuadas para determinadas situaciones.

Latencia demasiado baja

Datastore prioriza la durabilidad y la disponibilidad sobre la latencia mediante escrituras síncronas entre regiones o zonas. Si la aplicación requiere una latencia coherente inferior a 10 milésimas de segundo para leer o escribir datos, se recomienda usar una base de datos en la memoria como Memcached o Redis. También puedes usar una base de datos en la memoria como caché para Datastore, que se analiza más adelante en la situación de plataforma como servicio (PaaS). Para obtener más información sobre Memcached, consulta la documentación sobre su uso con App Engine y con Google Kubernetes Engine.

Cargas extremas

Datastore puede manejar operaciones a escala masiva. Sin embargo, para admitir funciones complejas, como la replicación y las transacciones, Datastore realiza algunas compensaciones que pueden disminuir el rendimiento en sistemas que se ocupan de tipos específicos de cargas extremas. Si tu aplicación realiza operaciones con un contenido de escritura demasiado alto, como la transferencia de datos continua desde los sensores de Internet de las cosas, considera usar Cloud Bigtable a fin de obtener mayores capacidades de transferencia de datos a expensas de las transacciones y los índices secundarios. Si tu aplicación suele mostrar la misma información a los usuarios, como una tabla de clasificación de jugadores en los videojuegos, considera el almacenamiento en caché del lado del cliente para reducir la carga y evitar las solicitudes innecesarias al servidor.

Semántica y esquema de SQL

Para realizar consultas complejas y eficientes, Datastore usa una sintaxis similar a la de SQL llamada GQL. Sin embargo, Datastore es una base de datos no relacional, por lo que no admite esquemas relacionales o consultas que usen semántica de SQL. En particular, Datastore no admite operaciones de unión, filtrado de desigualdad en varias propiedades o filtrado de datos basados en los resultados de una subconsulta. Si tu aplicación requiere compatibilidad con SQL, usa Cloud SQL para las escalas no horizontales o Cloud Spanner para las escalas horizontales y globales más grandes.

Análisis de Datos

Datastore está optimizado para el procesamiento de transacciones en línea (OLTP). Si la aplicación requiere una opción de almacenamiento para los análisis de tablas completos y las consultas interactivas en un sistema de procesamiento analítico en línea (OLAP), usa BigQuery. Si la aplicación necesita sistemas de OLTP y OLAP, usa Datastore como sistema de OLTP y exporta datos de Datastore a BigQuery para analizarlos, como se explica más adelante en la situación de la plataforma de estadísticas de datos.

Aplicaciones móviles en tiempo real

Datastore está diseñado para almacenar grandes cantidades de datos a los que se puede acceder desde el servidor. Si tu aplicación está basada en dispositivos móviles y necesita una funcionalidad en tiempo real, como una ejecución automática de actualizaciones que se activa debido a cambios en los datos, considera usar Firebase. La plataforma Firebase proporciona distintas funciones enfocadas a dispositivos móviles, incluidos el informe de fallas, la autenticación y la administración de usuarios y las estadísticas de eventos de usuarios.

Integración de Datastore en otros productos de GCP

Una aplicación web de gran tamaño requiere más que un sistema de base de datos escalable. También necesita servidores web escalables, un sistema de almacenamiento en caché, una solución de almacenamiento para copias de seguridad y, quizás, un almacén de datos con una canalización de extracción, transformación y carga (ETL) a fin de admitir las estadísticas de datos o las cargas de trabajo de aprendizaje automático (AA). Datastore es adecuado si deseas administrar la única fuente de información que es fundamental para la aplicación y, además, se integra a diversos productos de GCP a fin de satisfacer una gran variedad de necesidades. En el siguiente diagrama, se ilustra esta flexibilidad.

Descripción general de la integración de Datastore a otros productos de GCP

Figura 2. Descripción general de la integración de Datastore a otros productos de GCP.

Los programas que se ejecutan en Compute Engine, Google Kubernetes Engine, App Engine y Cloud Functions pueden usar Datastore para leer y escribir datos transaccionales a gran escala. El entorno de ejecución que elijas dependerá del nivel de administración y personalización que necesiten los equipos de infraestructura y desarrollo, por ejemplo:

  • Compute Engine te brinda un control total sobre las máquinas virtuales (VM).
  • GKE facilita la implementación y la organización de tus contenedores.
  • App Engine administra toda la infraestructura para que puedas enfocarte en el código.
  • Cloud Functions te permite implementar microservicios controlados por eventos.

Los programas interactúan con Datastore mediante las API de REST o de RPC de bajo nivel, o mediante una de las bibliotecas cliente multiplataforma disponibles para los lenguajes C#, Go, Java, Node.js, PHP, Python y Ruby.

Datastore admite la exportación de datos a Cloud Storage con fines de archivo o recuperación ante desastres, o a BigQuery para obtener estadísticas de datos, ya sea directamente o a través de Cloud Storage. También puedes escribir una canalización de Dataflow personalizada para filtrar entidades con una propiedad configurada como true o procesar datos antes de cargarlos en BigQuery para su análisis, por ejemplo. Para crear copias de seguridad diarias, puedes usar App Engine (solo el entorno flexible) o Cloud Functions a fin de programar la ejecución de una canalización de Dataflow, o puedes usar trabajos cron con Compute Engine.

Por último, puedes usar Datastore como parte de una canalización de aprendizaje automático. Por ejemplo, la canalización podría procesar datos en AI Platform, ya sea directamente mediante la biblioteca de Python de Datastore o indirectamente mediante la exportación de datos a Cloud Storage o BigQuery.

Arquitecturas de referencia

En esta sección, se describen situaciones para compilar aplicaciones web grandes que combinan Datastore con otros productos de GCP. Se abordan diferentes tipos de funcionalidades, como las exportaciones diarias, el almacenamiento en caché, el procesamiento de datos y los modelos de entrenamiento para el aprendizaje automático, y se proporciona una arquitectura de referencia para cada situación.

Las situaciones y arquitecturas no son prescriptivas. En cambio, se pretende destacar la variedad de usos posibles de Datastore en la compilación de aplicaciones web escalables. Puede que, a partir de estos ejemplos, quieras cambiar tu propia aplicación web, ya que puedes reorganizar y adaptar sus componentes para satisfacer tus requisitos específicos.

Situación 1: infraestructura con ajuste de escala automático simple con instantáneas de base de datos diarias

En esta situación, un grupo de instancias administrado de VM de Compute Engine entrega una aplicación web grande. El grupo de instancias escala automáticamente según los aumentos o las disminuciones de la carga, y el balanceador de cargas HTTP(S) de Cloud enruta el tráfico entrante entre las instancias disponibles. Las VM interactúan directamente con Datastore para leer y escribir datos transaccionales. Las instantáneas diarias de la base de datos se almacenan en Cloud Storage y las reglas de administración del ciclo de vida de los objetos transfieren las instantáneas anteriores de forma periódica a Cloud Storage Coldline para reducir el costo de almacenamiento de datos archivados.

Infraestructura con ajuste de escala automático simple con instantáneas de base de datos diarias

Figura 3. Infraestructura con ajuste de escala automático simple con instantáneas de base de datos diarias.

Situación 2: infraestructura basada en contenedores

En esta situación, una plataforma de videojuegos admite el acceso simultáneo de decenas de miles de jugadores. La plataforma está compuesta por cientos de microservicios en contenedores alojados en GKE. La plataforma tiene tres capas de microservicios implementados como pods de Kubernetes con ajuste de escala automático: pods del controlador NGINX, de frontend y de backend.

El proxy de SSL de Cloud balancea las cargas del tráfico entrante de TCP y SSL entre los pods del controlador NGINX, que manejan el balanceo de cargas HTTP entre los pods de frontend mediante la permanencia de las sesiones. Este enfoque garantiza que las solicitudes de un mismo cliente se reenvíen siempre al mismo pod de frontend. Para reducir la latencia, los pods de frontend pueden almacenar en caché la información específica del cliente y las opciones de configuración de los jugadores de forma local. Los pods de backend pueden reducir la latencia mediante la administración de algunas áreas particulares del mundo del videojuego y el almacenamiento en caché de la información específica del área de manera local. Los pods de frontend y backend escriben la información almacenada en caché en Datastore al mismo tiempo para el almacenamiento a largo plazo. Este método garantiza que no se pierda ningún estado si se finalizan los pods de frontend y backend.

Plataforma de videojuegos basada en contenedores con la tecnología de Kubernetes Engine y Datastore

Figura 4. Plataforma de videojuegos basada en contenedores con la tecnología de Kubernetes Engine y Datastore.

Para obtener más información sobre la implementación del controlador NGINX en GCP, consulta la guía práctica. Si quieres obtener una arquitectura de referencia alternativa para una plataforma de videojuegos compleja, consulta una solución más detallada.

Situación 3: infraestructura basada en funciones

En esta situación, una plataforma de administración de eventos expone una API a las aplicaciones de usuario móviles y de escritorio. Cada extremo de la API se implementa como un microservicio que, a su vez, se implementa en Cloud Functions. Cada extremo de la API proporciona un servicio específico, como hacer una lista de eventos, mostrar información del lugar o reservar entradas. Los microservicios se implementan en JavaScript y usan la biblioteca cliente de Node.js para que Datastore lea y escriba datos persistentes. Con esta arquitectura sin servidores completamente separada, puedes escalar cada servicio de forma independiente.

Infraestructura sin servidores basada en funciones que escribe datos persistentes en Datastore

Figura 5. Infraestructura sin servidores basada en funciones que escribe datos persistentes en Datastore.

Situación 4: Plataforma como servicio

En esta situación, usarás el entorno estándar de App Engine, la solución PaaS de Google, para compilar una aplicación de venta minorista. La aplicación se divide en microservicios de App Engine independientes; cada uno administra su propia área de responsabilidad: perfiles de usuarios, registros de compra, información de productos y atención al cliente.

App Engine maneja el ajuste de escala automático de cada microservicio y el balanceo de cargas automático entre instancias. Los microservicios se implementan mediante el lenguaje de programación compatible (Java, Python, PHP y Go) que mejor se adapte a su propósito y usan las bibliotecas cliente estándar de App Engine para acceder a Datastore. Para acelerar las interacciones de los usuarios y aligerar las cargas de base de datos, App Engine almacena en caché los resultados de las consultas frecuentes de la base de datos en su componente de Memcached integrado.

Aplicación web con ajuste de escala automático administrada por el entorno estándar de App Engine, Datastore y Memcached

Figura 6. Aplicación web con ajuste de escala automático administrada por el entorno estándar de App Engine, Datastore y Memcached.

Situación 5: Plataforma de estadísticas de datos

En esta situación, una plataforma web se divide en dos compartimientos principales: operaciones empresariales y estadísticas de negocios. Las operaciones empresariales consisten en una aplicación web que responde a las solicitudes de los clientes. La aplicación se compila mediante un grupo de ajuste de escala automático de instancias de Compute Engine. El balanceador de cargas HTTP(S) de Cloud se encarga del balanceo de cargas de las instancias. La aplicación lee y escribe datos directamente en la base de datos en Datastore. Las instantáneas de la base de datos se crean a diario y se almacenan en Cloud Storage.

El compartimiento de estadísticas de negocios supervisa y obtiene información valiosa sobre el rendimiento de las operaciones empresariales a fin de planificar y luego implementar mejoras a futuro. El sistema carga datos históricos todos los días a BigQuery desde las instantáneas de la base de datos que se guardan en Cloud Storage. El sistema también carga registros de aplicaciones en vivo desde instancias de Compute Engine en BigQuery en tiempo real a través de Pub/Sub. Este diseño permite que los analistas de datos exploren datos históricos y en vivo, y generen paneles visuales interactivos en Google Data Studio que los analistas empresariales y otros encargados de tomar decisiones pueden usar.

Plataforma de estadísticas de datos que administra datos históricos de Datastore y datos en tiempo real mediante Pub/Sub

Figura 7. Plataforma de estadísticas de datos que administra datos históricos de Datastore y datos en tiempo real mediante Pub/Sub.

Situación 6: Plataforma de aprendizaje automático

En esta situación, una aplicación de tienda en línea ofrece una amplia gama de productos para la venta. La aplicación se compila mediante el grupo de ajuste de escala automático de instancias de Compute Engine. El balanceador de cargas de HTTP(S) Cloud se encarga del balanceo de cargas de las instancias. Toda la información sobre los usuarios y los productos se guarda en Datastore.

Una canalización de aprendizaje automático administra un motor de recomendaciones que proporciona promociones personalizadas para los usuarios. Los datos históricos se extraen con frecuencia de Datastore y, luego, Dataflow los transforma en el modo por lotes. Los datos transformados se almacenan en Cloud Storage y AI Platform los usa como atributos para entrenar el modelo del motor de recomendaciones. Las iteraciones del modelo entrenado se guardan en Cloud Storage y se cargan en AI Platform para generar ofertas promocionales en vivo que se muestran en la interfaz de usuario de la aplicación. El proceso general se organiza a través de Apache Airflow, que se ejecuta en Compute Engine. Los científicos de datos experimentan con modelos de aprendizaje automático nuevos a través de Datalab.

Plataforma de aprendizaje automático que procesa datos históricos de Datastore a fin de generar ofertas promocionales en vivo para los usuarios

Figura 8. Plataforma de aprendizaje automático que procesa datos históricos de Datastore a fin de generar ofertas promocionales en vivo para los usuarios.

¿Qué sigue?