Tema: chat web
Ver Mensaje Individual
  #6 (permalink)  
Antiguo 09/10/2013, 11:02
AlanChavez
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: chat web

Siempre que veo que alguien quiere hacer un chat con una base de datos, xml o archivos de texto automaticamente me doy cuenta que hay un "espacio" en su conocimiento de protocolos de red, intercambio de información y arquitectura de computadoras.

Un chat es una aplicacion con muchos usuarios concurrentes enviando informacion constantemente.

Cuando escribes un archivo (.xml, .txt, .dat, lo que sea) el sistema opeartivo genera un "lock" para ese archivo de tal manera que no se puede escribir ni leer de ese archivo hasta que ese "lock" sea liberado.

Por lo tanto utilizar archivos para construir un chat, es pesima idea porque en cuanto el numero de usuarios de 0 a 20 vas a empezar a notar "lag" y conforme el numero de usuarios vaya aumentando, el mismo "lag" ira aumentando tambien.

¿Porque? Porque asi funcionan las computadoras, cuando escribes algo a un archivo, el sistema operativo tiene que escanear el disco, encontrar el archivo, crear un lock, abrir el archivo, escribir los bytes y liberar el lock.

Si tu servidor es multithreaded, entonces puede realizar varias operaciones al mismo tiempo, pero en el caso que estes un host compartido, muy probablemente tu host es una maquina virtual con 1 thread para tu usuario, o en otras palabras, solamente puede hacer 1 cosa al mismo tiempo, y esa misma cosa la tiene que repartir entre administrar usuarios, servir contenido, liberar memoria, etc... por lo tanto construir un chat basado en archivos es super ineficiente.


Con respecto a tu segunda idea:
Construir un chat usando MySQL, es el mismo problema con los archivos, al final del dia las bases de datos son programas que escriben a archivos de una manera super optimizada.

MySQL maneja las conexiones concurrentes dependiendo del tipo de motor de almacenamiento que utilices. MySQL tiene varios motores de almacenamiento que se aplicar POR tabla, pero los dos mas comunes son:

1) InnoDB
2) MyISAM

La diferencia radica en como escriben los "locks" a las tablas.

MyISAM, escribe "locks" por tabla. Es decir que si estas escribiendo a una tabla con MyISAM, nadie mas va a poder escribir sobre esa tabla hasta que tu termines. Repite eso por cada usuario conectado, y empezaras a ver el mismo LAG que te mencione anteriormente.

InnoDB escribe "locks" por renglones, es decir que MySQL puede hacer operaciones sobre la tabla simultaneamente ya que solamente bloquea los renglones, no la tabla completa.

Seguramente estaras pensando "ahh pues entonces utilizo InnoDB"

El problema con InnoDB es que es relativamente lento con los "SELECTS", o almenos es mas lento que MyISAM cuando haces SELECTs por el mismo tipo de "locking" porque tiene que verificar que los renglones que va a utilizar para el SELECT no tengan un lock, y si tienen un lock, tiene que esperar a que ese lock se libere para poder seleccionarlo. Este escenario es muy comun en un ambiente de "Chat".

y ya que vas a estar haciendo tanto INSERTS como SELECTS en tus tablas, por lo tanto usar MySQL (o cualquier base de datos) para implementar un chat es una pésima

Entonces, ¿Como construyes un chat?

Primero entiende lo que es un chat, un chat en su forma mas simple es un programa que establece una conexion persistente en el servidor, envia un mensaje al servidor y el servidor regresa ese mensaje de regreso a los clientes conectados.

Por lo tanto, si quieres construir un chat (rapido) necesitas programar un servidor que acepte multiples conexiones en cierto puerto, y cada vez que un cliente se conecte al servidor, entonces el servidor regresa ese mensaje a todos los clientes conectados.

Si deseas mantener un registro historico de todas las conversaciones, tienes que implementar un buffer en tu servidor, y cada vez que ese buffer se llena, vaciar los contenidos del buffer a la base de datos y empezar con un buffer completamente limpio.


Como programas ese servidor?
Puedes utilizar PHP con Sockets, Puedes utilizar Java o puedes utilizar nodejs si tienes ganas de un cambio total de paradigma ;)