Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Comet o Como actualizar la web en tiempo real

Estas en el tema de Comet o Como actualizar la web en tiempo real en el foro de Frameworks JS en Foros del Web. Buenas a todos!! Que tal?? Miren, estoy programando algo parecido a una red social y necesitaría ser capaz de que automáticamente y sin recargar la ...
  #1 (permalink)  
Antiguo 03/09/2011, 04:23
 
Fecha de Ingreso: marzo-2011
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 2
Comet o Como actualizar la web en tiempo real

Buenas a todos!! Que tal??

Miren, estoy programando algo parecido a una red social y necesitaría ser capaz de que automáticamente y sin recargar la pagina ni realizar ninguna acción tipo AJAX, la web se actualizase sola.

Al principio pensé en un bucle javascript de unos 5 segundos y que realizara peticiones AJAX contra la BD funcionaria, pero lo único que conseguiría así seria saturar el servidor.

Documentandome un poco, leí algo acerca de Comet (http://es.wikipedia.org/wiki/Comet), el cual era una conexión con el servidor sin cerrar, el cual cuando obtenía resultados, los enviaba al cliente y dejaba otra vez sin cerrar el canal.

El principal inconveniente que tengo es que mi hosting (el que tengo mirado, todavía no se por cual decidirme) utiliza el servidor Apache, servidor con el que no se puede usar Comet.

En la wiki pone que es usado por varias paginas web, entre ellas Facebook que, clusters aparte, corre sobre linux + apache, tal vez las peticiones Comet son lanzadas hacia otro servidor con soporte Comet (es decir, que no use apache).

La pregunta es: Alguien conoce algún método de poder realizar lo que pretendo sobre Apache?? Sin tener que meter servidores aparte para que me gestionen Comet???

Un Saludo y muchas gracias!!

PD: Lo he colocado en el apartado de JavaScript, ya que si no es con comet, esta operación debe impliar algo de JavaScript.
  #2 (permalink)  
Antiguo 03/09/2011, 06:49
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: Comet o Como actualizar la web en tiempo real

Podrías usar Jabber, pero lo más recomendable es que investigues acerca de node.js
  #3 (permalink)  
Antiguo 05/09/2011, 00:58
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Comet o Como actualizar la web en tiempo real

Se me acaba de ocurrir la siguiente forma sencilla y no creo que sea problemático respecto a la saturación.

La cosa es crear un iframe que enlace a un archivo html que se recargará cada 5seg.(por ejemplo), este archivo lo único que contiene es un script js con una variable que cambiara cada que alguien actualize la página y otra línea que ejecutará la función AJAX mediante una condición.

Esa condición será que si la variable almacenada por la ventana padre es igual a la del iframe entonces no se ejecuta la función AJAX, de lo contrario se ejecuta y se almacena el nuevo valor de la variable.

Si no me entendiste, trataré de hacer un ejemplo real, mientras espero que sea agradable mi idea, saludos.
  #4 (permalink)  
Antiguo 05/09/2011, 10:46
Avatar de DrFaust  
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Aires
Mensajes: 308
Antigüedad: 13 años, 3 meses
Puntos: 87
Respuesta: Comet o Como actualizar la web en tiempo real

Hace algún tiempo programé un chat en Ajax y me enfrenté al mismo problema.

Según lo que pude investigar, los servidores web son capaces de responder a un gran número de peticiones en un periodo corto de tiempo, pero no responden bien a tener varias conexiones abiertas simultáneamente.

Lo que hice fue un cliente en JavaScript que enviaba cada 2 segundos una petición que incluía la ID del último elemento mostrado. El servidor devolvía cualquier elemento nuevo (posterior a esa ID), o nada. El periodo entre petición y petición se hacía más largo según cuánto tiempo había pasado desde la última vez que había aparecido un elemento nuevo. De este modo los canales de chat activos se actualizaban cada 2 segundos, pero un canal desierto se actualizaba cada 10.

Este intercambio requería muy poco ancho de banda: las cabeceras HTTP, y una ID de dos bytes. Nada que un servidor web no pueda manejar, incluso teniendo una buen puñado de usuarios online al mismo tiempo.
  #5 (permalink)  
Antiguo 05/09/2011, 11:20
 
Fecha de Ingreso: marzo-2011
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 2
Respuesta: Comet o Como actualizar la web en tiempo real

Buenas!!

Cita:
Iniciado por IXtremeLT Ver Mensaje
Se me acaba de ocurrir la siguiente forma sencilla y no creo que sea problemático respecto a la saturación.

La cosa es crear un iframe que enlace a un archivo html que se recargará cada 5seg.(por ejemplo), este archivo lo único que contiene es un script js con una variable que cambiara cada que alguien actualize la página y otra línea que ejecutará la función AJAX mediante una condición.

Esa condición será que si la variable almacenada por la ventana padre es igual a la del iframe entonces no se ejecuta la función AJAX, de lo contrario se ejecuta y se almacena el nuevo valor de la variable.

Si no me entendiste, trataré de hacer un ejemplo real, mientras espero que sea agradable mi idea, saludos.
La verdad es que ya lo había pensado, hacer peticiones de "peso mínimo" y segun el resultado (1 o 0) actualizar o no la pagina, pero de todos modos, si por ejemplo tuviese 1.000 usuarios conectados al mismo tiempo, y la transacción fuese de 3bytes, serían 3000 bytes cada 5 segundos.... No se yo si sería lo más indicado. Para pocos usuarios supongo que funcionaría, pero para muchos....

Cita:
Podrías usar Jabber, pero lo más recomendable es que investigues acerca de node.js
Me he documentado un poco y parece ser la mejor opción, ahora bien, tendría que instalar el framework en el servidor, aunque si es un VPS supongo que no habrá problema.

En este [URL="http://www.quizzpot.com/2011/01/como-instalar-node-js-y-escribir-primeros-programas/"]enlace[/URL] se explica como instalarlo, primero se tendría que compilar el motor V8 de google y luego ya ejecutar Node.js.

Voy a leer más sobre esto, muchas gracias!!
  #6 (permalink)  
Antiguo 05/09/2011, 11:37
Avatar de DrFaust  
Fecha de Ingreso: septiembre-2011
Ubicación: Buenos Aires
Mensajes: 308
Antigüedad: 13 años, 3 meses
Puntos: 87
Respuesta: Comet o Como actualizar la web en tiempo real

Cita:
Iniciado por Eskorbut0 Ver Mensaje
La verdad es que ya lo había pensado, hacer peticiones de "peso mínimo" y segun el resultado (1 o 0) actualizar o no la pagina, pero de todos modos, si por ejemplo tuviese 1.000 usuarios conectados al mismo tiempo, y la transacción fuese de 3bytes, serían 3000 bytes cada 5 segundos.... No se yo si sería lo más indicado. Para pocos usuarios supongo que funcionaría, pero para muchos....
Si tenés mil usuarios conectados simultáneamente, tu sitio web es un éxito rotundo, y podés darte el lujo de tener un servidor dedicado que soporte 200 peticiones por segundo y mucho más. En ese caso podés pensar en implementar una tecnología especializada, como node.js.
  #7 (permalink)  
Antiguo 05/09/2011, 13:11
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Comet o Como actualizar la web en tiempo real

Cita:
Iniciado por Eskorbut0 Ver Mensaje
Buenas!!



La verdad es que ya lo había pensado, hacer peticiones de "peso mínimo" y segun el resultado (1 o 0) actualizar o no la pagina, pero de todos modos, si por ejemplo tuviese 1.000 usuarios conectados al mismo tiempo, y la transacción fuese de 3bytes, serían 3000 bytes cada 5 segundos.... No se yo si sería lo más indicado. Para pocos usuarios supongo que funcionaría, pero para muchos....

Creo que no entendiste bien como funciona mi plan, porque todo el proceso es en el cliente y hasta que se detecta el cambio en la variable se hace la petición al servidor, por lo que no hay ninguna petición en vano al servidor.
  #8 (permalink)  
Antiguo 05/09/2011, 13:20
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: Comet o Como actualizar la web en tiempo real

IXtremeLT, imaginate un chat en el que vos escribís un mensaje. Siendo esa la situación, con tu lógica sólo vos te enterarías que hay un mensaje nuevo: las demás personas conectadas no se enterarían de tu actualización hasta no postear ellos mismos un mensaje. He ahí la falla de la lógica que estás planteando.
  #9 (permalink)  
Antiguo 05/09/2011, 19:41
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Comet o Como actualizar la web en tiempo real

Hola que tal papino, esque aún no me he dado a entender bien pero ya lo he probado y funciona ok!, así funciona:

1. La página principal contiene una variable que guarda el valor de la variable del iframe y se hace la petición con AJAX
2. El iframe se recarga y hace una comparación, si la variable de la ventana principal es distinta al la del iframe se hace la petición, pero en éste caso no hace hace por que la variable es la mísma.
3. El usuario envía un mensaje.
4. Se modifica el valor de la variable del archivo del iframe.
5. Al actualizarse el iframe, se da cuenta que la variable es diferente a la anterior entonces se procede a hacer la petición a "todos los usuarios" y entonces se guarda el nuevo valor para evitar que se vuelva a hacer la petición hasta que haya un nuevo mensaje.

Pondré un ejemplo con código para explicarlo un poco mejor.

Página principal:
Código HTML:
Ver original
  1. var id_peticion=12;
  2. function actualizarMensaje(){
  3.  //ETC. ETC
  4.  document.getElementById("mensaje") = responseText; //es el resultado de la peticion
  5. }
  6. </head>
  7. <form action="cambiarMensaje.php">
  8. <input type="text" name="nuevo_mensaje" value="Cambiar mensaje" /><input type="submit" />
  9. </form>
  10. <div id="mensaje"></div>
  11. <iframe src="actualizador.html" style="display:none"></iframe>
  12. </body>
  13. </html>
actualizador.html
Código HTML:
Ver original
  1. <meta http-equiv="refresh" content="1" />
  2. var id_peticion=1231;//Cualquier valor distinto al de la ventana principal
  3. var id_peticion_top=window.top.id_peticion;
  4. if(id_peticion!=id_peticion_top){
  5.  window.top.id_peticion=id_peticion;
  6.  window.top.actualizarMensaje();
  7. }
  8. </head>
  9. </body>
  10. </html>
cambiarMensaje.php
Código php:
Ver original
  1. <?php
  2. /*
  3. Código para insertar el mensaje enviado...
  4. */
  5. //Se cambia el valor de la variable del archivo "actualizador.php"
  6.  
  7. //Leemos el archivo del iframe
  8. define( "N", "actualizador.html");
  9. $f = fopen( N, "r" );
  10. $l = fread ( $f, filesize( N ) );
  11. fclose( $f );
  12.  
  13. //Editamos la variable "id_consulta"
  14. $l = preg_replace( "/id_consulta = .*;/", "id_consulta = ".rand().";", $l );
  15.  
  16. //Guardamos los cambios
  17. $f = fopen( N, "w" );
  18. fwrite( $f, $l );
  19. fclose( $f );
  20. ?>
Creo que con esto queda mejor explicado, aunque no puse el código faltante ya que eso es lo de menos pues es lo de siempre. Como mencioné, ya lo probé usando difentes sesiones con varios navegadores y todo funciona ok, Saludos.
  #10 (permalink)  
Antiguo 05/09/2011, 20:19
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: Comet o Como actualizar la web en tiempo real

Cita:
5. Al actualizarse el iframe, se da cuenta que la variable es diferente a la anterior entonces se procede a hacer la petición a "todos los usuarios" y entonces se guarda el nuevo valor para evitar que se vuelva a hacer la petición hasta que haya un nuevo mensaje.
Aquí está tu error.
Para eso necesitarías un servidor que haga "push" a todos los usuarios. Pero eso no es lo que sucede lamentablemente.
Si te está funcionando, es porque estás haciendo otra cosa: requests al servidor cada x cantidad de tiempo para verificar si el id ha cambiado. Eso es lo que se conoce como polling y supone una gran carga para el servidor. Una carga que es inversamente proporcional al intervalo de tiempo y directamente proporcional a la cantidad de usuarios conectados. Y es también como se resuelven la mayoría de los chats AJAX.
Aquí hay otro ejemplo de esos que no recomiendo porque también implica una gran carga para el servidor.Está basado en otra técnica llamada long-polling:
http://www.forosdelweb.com/2813329-post33.html

Última edición por Panino5001; 05/09/2011 a las 20:28
  #11 (permalink)  
Antiguo 06/09/2011, 02:32
 
Fecha de Ingreso: marzo-2011
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 2
Respuesta: Comet o Como actualizar la web en tiempo real

Exacto... como dice Panino5001, el servidor en este caso seria el encargado de enviar la llamada a los demás.

He encontrado una imagen que diferencia perfectamente estos casos:




Lo que me interesa hacer es el caso de la derecha, donde el cliente genera la primera petición y cuando se vayan produciendo eventos en el servidor, este los sirva al cliente. Me he pasado unos cuantos días leyendo y creo que la única solución para hacer esto es implementar otros servidores (como Node.js) que lo implementen, ya que con apache creo que definitivamente no se puede. Aparte que Node.js funciona mejor que apache cuando estos tienen muchos usuarios:



Estoy haciendo consultas a empresas de hosting sobre si en sus VPS dan acceso como root, si es así, intentaré implementar lo del Node.js, no creo que sea muy dificil.
  #12 (permalink)  
Antiguo 06/09/2011, 11:19
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Comet o Como actualizar la web en tiempo real

papino disculpame por contradecirte porque obviamente tu tienes más experiencia que yo, pero no he hecho nada mas que aplicar la forma que he mencionado y sin dudas algunas funciona perfectamente sin hacer peticiones en vano, estoy seguro que es por que no lo he explicado muy bien, me gustaría poner el código completo de la prueba que tengo aquí pero es casi inesearía ya que es casi lo mísmo de la que puse arriba solo tiene el codigo php para insertar los mensaje y recogerlos. No entiendo por que dices que hay una falla si yo la probé iniciando varias sesiones y todos los mensajes llegan al mísmo tiempo.

Última edición por IXtremeLT; 06/09/2011 a las 11:37
  #13 (permalink)  
Antiguo 06/09/2011, 11:49
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: Comet o Como actualizar la web en tiempo real

Entiendo cómo funciona. Pero lo que hacés es un request cada 1 segundo al archivo actualizador.html. Y ese archivo está en el servidor (si no lo estuviera no podrías reescribirlo con fopen). En síntesis, estás usando polling: un request al servidor cada cierto intervalo de tiempo para controlar un cambio de estado. Por más que sea un archivo html (podría ser incluso un txt), el servidor tiene que enviarlo al navegador en cada una de las peticiones. Y si tuvieras 100 usuarios conectados en simultáneo, estarías enviando 100 peticiones distintas por segundo a tu servidor. Basta con que mires la pestaña red de firebug para que lo veas más claramente
  #14 (permalink)  
Antiguo 06/09/2011, 11:59
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Comet o Como actualizar la web en tiempo real

Haa ya te entendí, eso no lo había pensado te lo agradezco, pero entonces ¿aunque sea un par de bytes por segundo puede afectar al haber muchos usuarios?
  #15 (permalink)  
Antiguo 06/09/2011, 11:59
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 6 meses
Puntos: 834
Respuesta: Comet o Como actualizar la web en tiempo real

Eso mismo
  #16 (permalink)  
Antiguo 06/09/2011, 12:21
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Comet o Como actualizar la web en tiempo real

Entonces como dice Eskorbut0 , lo mejor es atenerse a Node.js y dejar a un lado apache, mmm... no puedo creer que apache no pueda hacer algo similar hehe, pero pronto investigaré sobre Node.js para ver como es la cosa, según esa gráfica, Node.js sigue manteniendo su velocidad para enviar datos a diferencia de Apache aunque haya 800 usuarios.
  #17 (permalink)  
Antiguo 06/09/2011, 12:47
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 7 meses
Puntos: 343
Respuesta: Comet o Como actualizar la web en tiempo real

@Eskorbut0

Podrias agregar un link al benchmark en cuestión?
__________________
blog | @aijoona

Etiquetas: comet, javascript, real
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:30.