Creando un chat: Descripción del problema (Primera parte)

Aunque la idea de crear un Chat es bastante simple, la situacion se complica cuando se trata de hacer que funcione en un navegador web sin ningún requisito adicional. Seguramente habrán notado que muchos sitios de chat requieren que se instalen componentes adicionales tales como un plugin de Java para poder utilizar Applets, el plugin de Flash o algún control de ActiveX para aquellos fans de explorer. ¿Cuál es el motivo para esta exigencia tecnológica?

El protocolo HTTP se limita a una comunicación unidireccional, en la que el cliente solicita un recurso mediante un método y el servidor se limita a responder.

El protocolo de transferencia de hipertexto (HTTP), que es una de las partes fundamentales de la web, es un protocolo para transferencia de datos que no tiene estado, es decir, que cada petición que se hace a un servidor utilizando este protocolo es considerada como nueva. Este modelo resolvía las necesidades de la web en los 90’s en donde la mayor parte de los sitios eran páginas estáticas. Adicionalmente, dado que los servidores únicamente se dedicaban a escuchar peticiones y responderlas, se definieron métodos de petición que el cliente debe hacer y los códigos de respuesta que dará el servidor junto con el recurso solicitado, dando como resultado un protocolo en el que el servidor no puede iniciar una conversación con el cliente.

Existen diferentes tipos de aplicaciones web en las que es necesario que sea el servidor el que comience la comunicación con el cliente, como es el caso de un chat, pues el cliente debe ser notificado en cuanto otra persona le envíe un mensaje, siendo tarea del servidor, que funge como intermediario de la comunicación, quien de este aviso. Una de las tecnologías que resuelven este problema son los Applets, los cuales tienen la capacidad de crear conexiones TCP en las que se tiene un canal bidireccional de comunicación. Recientemente tenemos también la creación del protocolo de WebSockets con la llegada de HTML5, que resulve el problema de tener un canal de comunicación bidireccional, aunque aún no llega a ser un estándar debido a la gran variedad de exploradores web en uso.

Aplicaciones como un servicio de chat requieren de una comunicación bidireccional, es decir, que el servidor tenga la capacidad de hacer llegar mensajes a los clientes.

El surgimiento de AJAX dio pie a tratar de utilizar HTML y Javascript para simular una comunicación bidireccional, surgiendo una serie de técnicas que se agrupan bajo el nombre de “Comet” como son, polling, long polling y streaming. Cada una de estas técnicas representa una serie de retos tecnológicos y trata de dar una respuesta al problema de la comunicación bidireccional, teniendo cada una sus ventajas y desventajas. Antes de comenzar a enumerarlas, debemos preguntarnos por qué las soluciones basadas en plugins no son satisfactorias. La respuesta es simple, los plugins, además de forzar al usuario a utilizarlos, no necesariamente están disponibles para todas las plataformas, pensemos por ejemplo en ActiveX que es exclusivo de Windows, Flash que no está disponible en los nuevos sistemas de Mac y los Applets de Java que no están disponibles en todos los navegadores web de móviles.

El uso de Internet se ha extendido de tal modo a los dispositivos portátiles que es cada vez mas importante tenerlos en cuenta en el desarrollo de sitios y aplicaciones web. Es importante que un sitio o aplicación web trate de soportar a la mayor cantidad de “User Agents”, de manera que no se descuide a ninguno de sus potenciales usuarios, además de que la promesa original de la web incluía el hecho de ser navegable con independencia del explorador con el que se hiciera. Con la llegada de HTML5 y el protocolo de WebSockets se facilitarán las cosas. Pero estamos en un momento de transición en el que no todos los navegadores web soportan el protocolo de WebSockets y que muchos usuarios aún no migran hacia aun explorador web con soporte a esta tecnología que desafortunadamente no se encuentra aún estandarizada.

Comencemos entonces por describir las técnicas que simulan la comunicación bidireccional utilizando el protocolo HTTP y AJAX.

Polling

Esta técnica es la manera más simple y al mismo tiempo más ingenua de tratar este problema. Consiste en utilizar peticiones asíncronas cada cierto tiempo para preguntar al servidor si existe una actualización disponible. Esta técnica es utilizada en muchos sitios como http://www.phpfreechat.net/

Utilizando la herramienta de firebug podemos ver cómo se hacen peticiones continuas al servidor para saber si ha ocurrido un cambio del que debamos ser notificados.

Cada determinado tiempo, digamos por ejemplo medio segundo, se lanza una petición asíncrona al servidor para conocer si hay nuevos mensajes. Si no existe ningún mensaje el servidor contestará que no los hay, en caso contrario entregará la información solicitada.

El problema que presenta esta técnica es que por un lado introduce latencia, es decir, que dado que hay un intervalo en que las peticiones asíncronas son enviadas, los mensajes que sean enviados entre el intervalo de peticiones, no nos serán informados hasta la siguiente petición.

Podemos pensar que la solución es utilizar un intervalo muy corto de tiempo entre peticiones, lo cual nos lleva al siguiente problema: el servidor puede saturarse de peticiones.

Polling introduce latencia y peticiones innecesarias para el servidor

Con esta técnica, el servidor tiene que estar recibiendo peticiones constantemente, aún cuando no exista ninguna información que enviar. Para aplicaciones con pocos usuarios esta puede ser un buen comienzo, sin embargo no escalará, debido al gran número de peticiones que se hará por usuario. La ventaja de esta técnica es su simple implementación, pues prácticamente cualquier entorno de desarrollo web nos permite lanzar peticiones asíncronas, que es lo único que requerimos para el polling.

Podemos encontrar múltiples implementaciones de esta técnica en diferentes lenguajes de programación e incluso en algunos frameworks. Por ejemplo para tecnologías basadas en Java Server Faces como son Rich Faces o Ice Faces, encontramos componentes para hacer peticiones de este tipo dado un intervalo de los cuales agrego un enlace en el nombre de cada tecnología.

Continuará en la siguiente entrada…

2 comentarios en “Creando un chat: Descripción del problema (Primera parte)

    • Creo que voy un poco lento con estos artículos y en general con el blog. Deben comprender que no tengo todo el tiempo libre que desearía para dedicarle. Intentaré terminar pronto con las entradas restantes.
      Saludos

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s