Diseño del servidor multijugador de Ideateca

Pablo Bravo —  3 de marzo de 2010 — 1 Comentario

El diseño de servidores es una tarea compleja que comprende observar multitud de aspectos y detalles. En dicho diseño influyen muchos factores. Por nombrar algunos; carga de usuarios esperada, modelo de procesos y/o hilos, tipo de servicio, etc…

En Ideateca nos hemos liado la manta a la cabeza y hemos decidido apostar por los juegos multijugador. Tras analizar las diferentes posibilidades, nos hemos decantado por un diseño sencillo pero potente con nuestro propio desarrollo.

En este post explicaremos el cómo y el por qué, que aunque parezca que hoy en día ya está todo hecho, aún puede ser útil y necesario un desarrollo ad hoc.

Nuestras necesidades son sencillas, clientes móviles para Android e IPhone, integración con Facebook y portal propio. Una carga esperada modesta inicialmente, pero un sistema que escale de manera adecuada hasta el máximo posible de usuarios por servidor físico. Casi nada…

La elección del modelo de entrada – salida era obvio; asíncrono, ya que queremos escalar bien en situaciones de carga con miles de usuarios. Es bien sabido que el mayor problema para escalar en un modelo síncrono es precisamente su esencia, los hilos. Un sistema puede manejar bien miles de descriptores de I/O (y si no, escribid un driver NDIS para Windows :), pero no maneja tan bien miles de hilos, ya que la sobrecarga para el dispatcher y el paginador empieza a ser excesiva.

Una vez decidido el modelo de I/O, entrábamos en el diseño propiamente dicho del servidor. Para aumentar la productividad, lo más adecuado es un diseño SEDA (Stage Event Driven Architecture). Podéis informaros un poco más aquí, o en éste pdf. He usado las ideas expuestas en la tesis anterior con éxito en otros sistemas software de ámbitos tan diferentes como motores antivirus. Este diseño promueve la diferenciación en etapas del tratamiento de los datos de una petición, favoreciendo la productividad de una forma semejante a las etapas del cauce de ejecución de un microprocesador actual.

Para finalizar la discusión del diseño “a vista de pájaro” de nuestro servidor multijugador de juegos, queda comentar el interfaz de alto nivel usado para exponer servicios y el tipo de protocolo usado para comunicar “peers”.

Buscamos por un lado, facilidad de uso y desarrollo, y por otro eficiencia y rendimiento. Esto lleva de forma lógica a un servicio al estilo RPC, que es sencillo de usar en los “end points” y que use un protocolo de transporte binario, que es efectivo y lo más compacto posible. Nuestro servidor usa un sistema de objetos remotos al estilo CORBA (o DCOM), pero muy simplificado para dar servicio a nuestras necesidades, que sin embargo facilita enormemente la integración de las aplicaciones con nuestro sistema de red y permite bondades tales como desarrollar localmente y de forma extremadamente sencilla convertir la aplicación en distribuida. Respecto al protocolo, poco hay que especificar, ya que serializa clases como estructuras y emite mensajes entendibles en un sistema RPC tales como “Invocación de método sobre objeto remoto” o “Resultado de ejecución de método” principalmente. Para aquellos que les resulte extraño no usar XML para todo, simplemente el sobrecoste del parseo de mensajes lo descalifica directamente para un sistema de alto rendimiento.

En otro “post” comentaré las idiosincracias de nuestro servidor, ya que, por norma general, todo tipo de discusiones sobre servidores se centran en servidores sin estado al estilo HTTP, donde un hilo cualquiera puede servir una petición cualquiera. Sin embargo en nuestro servidor, con estado, para asegurar el orden de mensajes en el caso basado en turnos, limitar la contención entre hilos y mejorar la productividad, se debe observar una estricta política de servicio de hilos a objetos.

Pablo Bravo García trabaja como ingeniero en Ideateca.

Pablo Bravo

Posts Twitter Google+

Developer

Trackbacks and Pingbacks:

  1. Diseño del servidor multijugador de Ideateca (II Parte) – Ideateca - 17 de marzo de 2010

    [...] con el post anterior en el que hablábamos del servidor de juegos de Ideateca, en éste voy a comentar el diseño de la [...]

Deja un comentario

*

Text formatting is available via select HTML.

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>