La escalable arquitectura nativa al cloud de Pokémon GO

·

·

, ,

El lanzamiento del videojuego para móviles Pokémon GO en 2016 representó un desafío de ingeniería colosal sin precedentes. Pokemon GO es un juego para móviles con una características que lo hacen único: es un videojuego de realidad aumentada que fusiona el mundo real con el virtual. Los usuarios deben salir a la calle y moverse físicamente para desplazar a su avatar en el juego, caminar por diferentes zonas, como bosques o lagos, para encontrar y atrapar sus Pokémon favoritos, formar equipos y batallar con otros jugadores para lograr victorias. El mapa virtual del videojuego es el propio mundo real: las calles se convierten en zonas de captura de Pokémons, y los lugares emblemáticos en puntos de reunión clave en el juego. La complejidad de las mecánicas de este videojuego reside en que todos los usuarios comparten una visión global y común del juego en tiempo real. Por ejemplo, un Pokémon salvaje que aparece en una ubicación concreta debe ser visible para todos los jugadores que se encuentran en esa zona. Poder soportar estas características, a gran escala, con usuarios distribuidos geográficamente alrededor del globo, y con expectativas para que el juego fuera fluido forman un complejo problema de ingeniería de sistemas distribuidos.

La novedad de la mecánica del juego y la gran popularidad de Pokémon en la cultura pop obligaron al equipo de desarrolladores del juego a recurrir a ingenieros de Google Cloud para enfrentar este reto de ingeniería sin precedentes. Las expectativas eran altas: Pokémon es la franquicia de medios más grande del mundo. Los ingenieros probaron su arquitectura con una carga de tráfico cinco veces superior a la carga media esperada, suponiendo el peor de los casos imaginados. La realidad es que el tráfico pico fue cincuenta veces el esperado, diez veces más que en el peor de los casos previsto.

Durante el lanzamiento del videojuego, ambos equipos trabajaron codo a codo para desplegar los servicios en plataformas escalables en la nube, como Google Datastore y Google Kubernetes Engine, y lograron salir airosos, haciendo que el lanzamiento del juego fuera un rotundo éxito.

Desde su lanzamiento, Pokémon GO sigue siendo un juego popular. Aunque ya han pasado los días de su pico máximo de jugadores, la base de usuarios se ha estabilizado y Niantic continúa confiando en Google Cloud para gestionar los picos de demanda en momentos críticos, como los Días de la Comunidad o el Pokémon GO Fest, una convención anual que reúne a jugadores de todo el mundo. Durante estos eventos, las transacciones por segundo en los servicios del juego pueden pasar de 400,000 a casi un millón en cuestión de segundos.

En este blog de Google, ingenieros de Google Cloud y Pokémon GO nos explican la arquitectura actual de los servicios del juego, con un enfoque en mantener la calidad del servicio durante estos picos de tráfico, garantizando una experiencia de juego fluida para todos los jugadores.

Las tecnologías principales de los servicios en la nube de Pokemon GO son Google Kubernetes Engine (GKE) y  Google Cloud Spanner.

Originalmente, la base de datos principal del juego se basaba en Google Datastore, un servicio de base de datos administrado NoSQL altamente escalable pero simple. Sin embargo, a medida que Pokémon GO crecía y se desarrollaban nuevas características, los desarrolladores comenzaron a notar las limitaciones de Datastore. Para lograr una mejor escalabilidad, capacidades de datos relacionales y consistencia fuerte, migraron los servicios a Cloud Spanner. La capacidad de Spanner para gestionar transacciones globales resulta vital para mantener las experiencias de juego en tiempo real.

Google Kubernetes Engine aloja los servicios front-end de Pokémon GO debido a su capacidad para escalar fácilmente en momentos clave. Las herramientas de monitoreo, logging y el soporte de ingenieros de Google aseguran estas operaciones sin inconvenientes. La infraestructura de Niantic incluye miles de nodos Kubernetes y 5000 nodos Spanner, que trabajan en conjunto para mantener una visión unificada donde los jugadores comparten el mismo mundo virtual.

¿Qué ocurre cuando capturas un Pokémon?

Uno de los pilares clave en la arquitectura de Pokémon GO es la distribución geográfica de los usuarios. Al abrir la app, el servicio Google Cloud Load Balancing distribuye a los jugadores según su ubicación geográfica. Un componente clave de la arquitectura es un backend de consultas geo-espaciales, que mantiene una caché de los datos del juego dividido por ubicación. Este servicio determina qué Pokémon aparecen en el mapa, cuáles gimnasios y su estado, las Poké-Paradas cercanas, y cualquier otra característica basada en la localización.

Cuando el jugador interacciona con el juego, como cuando se captura un Pokémon, se envía un evento desde el frontend de Google Kubernetes Engine a Spanner a través de la API. Spanner es consistente: una vez que se recibe la actualización, los datos espaciales se actualizan en la memoria y se utilizan para atender futuras solicitudes desde el frontend. Por ejemplo, cuando un jugador captura un gimnasio, estos datos se persisten en Spanner en ese mismo momento, actualizando además la caché del servicio de consultas espaciales. Posteriormente, cualquier otro jugador que interactúe con el gimnasio, hará que el frontend recupere información del backend de consulta espacial y la envíe de regreso al usuario.

Uno de los secretos para que el backend de consultas geo-espaciales pueda soportar miles de jugadores simultáneos es que los eventos que ocurren en el juego son totalmente deterministas. Por ejemplo, el tiempo y lugar en que un Pokémon salvaje aparece. Así, aunque varios jugadores estén en diferentes réplicas del servicio, pero en la misma ubicación física, tendrán una visión igual del mundo Pokémon. Para ello, existe una compleja lógica detrás, sincronización y almacenamiento en caché, especialmente para eventos.

En resumen, la sofisticada y escalable ingeniería detrás de Pokémon GO permite una agradable experiencia de juego de realidad aumentada en tiempo real. La arquitectura de Pokemon GO hace posible que millones de jugadores disfruten de una experiencia inmersiva y sin interrupciones. Con constantes innovaciones, Pokémon GO sigue marcando nuevas fronteras en el ámbito de los juegos móviles.


Leave a Reply

Your email address will not be published. Required fields are marked *