17. Juegos multiusuario. AJAX polling con CakePHP y Couperin

¡Hola, compi! He empezado a dar mis primeros pasos con AJAX hace poco y por momentos me pierdo porque no tengo muy bien asimilados algunos de los conceptos. Proceso de cliente por aquí, tiempo de espera por acá, proceso de servidor por allá… Todo un lío, vaya. Sé que hay que ordenar todas estas cosas de algún modo; de hecho, me ha dado por pensar que una aplicación AJAX es algo así como una orquesta cuyo director somos nosotros, los programadores. ¿Te gusta esta analogía?

Sí, como también coincide que últimamente me ha dado por escuchar a Couperin (a quien recién descubrí, por cierto), inserto a continuación este video que espero que te guste. A ver si su música nos ayuda a estimular el sistema cognitivo y nuestras aplicaciones AJAX dejan de lanzar errores por todas partes, como las mías ahora.

Pero vayamos al grano. Resulta que estoy trabajando en un juego multiusuario que implementa la técnica AJAX polling. Por cierto, estoy casi convencido de que sería mejor utilizar otras técnicas -long polling, sockets o COMET- pero finalmente utilizo esta porque para mí es la más sencilla. Bueno, también me tranquilizó un poco saber que esto puede hacerse así y que está muy bien para acercarse a AJAX long polling y a COMET.

¿Qué es AJAX polling?

AJAX polling es una técnica de programación que consiste en solicitar a intervalos de tiempo regulares la ejecución de la lógica determinada que implementa el servidor. El principal inconvieniente de esta técnica es su escalabilidad porque el número de peticiones puede llegar a incrementarse drásticamente si ese intervalo regular de tiempo es pequeño. Por ejemplo, si hay 1000 usuarios conectados a la aplicación y cada uno de ellos hace una petición por segundo, entonces el servidor recibe 2000 peticiones por segundo.

Además de esto, otra de las desventajas de AJAX polling es que el servidor siempre responde a las peticiones que recibe de los clientes, independientemente de si tiene alguna información nueva que entregarles. En otras palabras, los clientes siempre ejecutan la lógica de turno (actualizan la página cada segundo, por ejemplo) cada n segundos aunque no sea necesario.

Implementación de AJAX polling con CakePHP

Finalmente, mi aplicación multiusuario tiene varias tablas a las que acceden los jugadores de forma dinámica. Además de consultar y actualizar estas tablas, los jugadores calculan sus puntuaciones a partir de ellas y las visualizan en su pantalla en tiempo real. He implementado esta idea utilizando el método remoteTimer:


   echo $ajax->remoteTimer (  array(   'url' => array('controller' => 'multijugadores', 'action' => 'preguntar_sistema'),
                                       'update' => 'aciertos',
                                       'frequency' => 1
                                    )
                           );

Este método, envoltorio de los objetos Prototype PeriodicalExecuter y Ajax.Updater, pide cada segundo la ejecución de la acción preguntar_sistema. Esta acción es la que se encarga de realizar las consultas a las tablas comunes (un conjunto de tablas que todos los usuarios comparten) e imprimir las puntuaciones, calculadas a partir de éstas.

Estoy trabajando en local, la aplicación funciona y de momento no sé qué consecuencias puede tener esta implementación en el rendimiento del servidor compartido al que estoy a punto de subirla. ¿Tienes alguna experiencia con aplicaciones de este tipo? Si es así, cuéntanos… 😉

¿Y la música… De dónde sale?

Bueno, compi, pues Couperin aparece para ayudarme a abordar el problema de una forma no racional. Me refiero al problema de definir la idea de la aplicación multiusuario. Sí, Couperin es la fuente de inspiración que ha derribado las barreras lógica, hipotética y deductiva de la perspectiva izquierda de mi pensamiento y me ha ayudado a crear la idea. Seguro que las hay mejores (¡explícanos alguna, si las conoces!), pero estoy contento porque esta funciona. Espero que te animes a probarla y, si quieres, la comentamos aquí.

Anuncios