Google App Engine permite escalar aplicaciones y es por ello que en ZupCat desarrollamos nuestros juegos masivos free-to-play sobre esta plataforma. En esta ocasión les contaremos cómo realizamos nuestros procesamiento batch.


Para darles una idea de volumen que nuestros juegos alcanza, tenemos tablas con 270 millones de registros y no es raro tener requerimientos que impliquen recorrer cada uno de ellos para realizar operaciones como reactivación de usuarios o generación de rankings.
Procesar un registro en un proceso batch lleva los siguientes pasos obligatorios:
  1. Leer el registro de entrada
  2. Ejecutar queries adicionales en función del registro de entrada
  3. Correr ciertas líneas de código
  4. Efectuar operaciones de escritura relacionadas al registro de entrada


Imaginen ejecutar estos 4 pasos 270 millones de veces durante varias veces al día. Si procesar un registro lleva 1 segundo, todo el proceso demoraría ¡¡3125 días!!

MapReduce es un modelo de programación destinado a procesar grandes cantidades de datos en paralelo y de manera distribuida sobre un cluster. Se basa en partir el total de registros a procesar en grupos con cantidades similares de registros. Cada grupo va a ser procesado en paralelo de manera distribuida.

Ese procesamiento comienza por una fase llamada Map que se ocupa de filtrar, seleccionar, contar u ordenar un conjunto de registros.
El resultado de la fase Map, que en general es menor al grupo original de registros, es procesado en una fase posterior llamada Reduce. Esta fase también corre en paralelo y en general sumariza los resultados de la fase Map.


En general un programador necesita implementar código en Map y Reduce mientras que el framework se ocupa de correr las tareas en paralelo, administrar la comunicación entre los procesos, transmitir datos y proveer redundancia y tolerancia a fallos.

mapreduce_mapshuffle.png


Es posible utilizar este modelo en Google App Engine integrando el proyecto open source llamado appengine-mapreduce y contar con esta estrategia de procesamiento.


Screen Shot 2014-05-03 at 17.22.06.png


Esta captura de un proceso real muestra como casi 7000 registros fueron procesados a una promedio de 84 por segundo en 50 procesos en paralelo. Las barras amarillas muestran como claramente el proceso fue dividido en 50 trabajadores paralelos.

Es importante notar que 50 trabajadores es un número configurable en relación a velocidad contra el costo de procesamiento que estamos dispuestos a pagar. Es decir, podemos reducir linealmente el tiempo que demora un proceso aumentando la cantidad de trabajadores involucrados en Map Reduce. Esto se logra sin tocar una sola línea de código sino solo configurando los parámetros del proceso.

Este post ha sido escrito por Hernán Liendo, Google Developer Expert en Cloud Computing, profesor universitario y co- fundador y CTO de ZupCat donde coordina los esfuerzos de ingeniería para desarrollar juegos masivos free-to-play.