¿Cómo mostrar actualizaciones continuas en tiempo real como Facebook ticker, la página de inicio de meetup.com?

¿Cómo mostrar actualizaciones continuas en tiempo real en el navegador, como Facebook ticker, y la página de inicio de meetup.com? En Python, PHP, node.js y ¿cuál sería el impacto en el rendimiento en el lado del servidor? Además, ¿cómo podríamos lograr la misma actualización si la página es almacenada en caché por un CDN como akamai?

Tienes dos opciones (que otras han detallado más arriba). En caso de que no esté familiarizado con algunas de las ideas conceptuales detrás de cada opción, pensé en dar una o dos líneas sobre ellas. Tenga en cuenta que estoy presentando estos conceptos a un nivel muy, muy alto.

Sus tres opciones son:

  1. Encuesta corta
  2. Web Socket
  3. Cometa / larga encuesta

Encuesta breve

El sondeo corto supera la comunicación unidireccional entre el Cliente-Servidor al obligar al cliente a enviar continuamente solicitudes al servidor del formulario:

Client: Do you have a message for me? Server: No. Client: (wait x seconds) Client: Do you have a message for me? Server: No. Client: (wait x seconds) Client: Do you have a message for me? Server: Yes. Here it is! Client: Yay! Client: (update message) 

La constante molestia en nombre del cliente se llama sondeo . Para implementar esta estructura, deberá configurar su servidor para que “escuche” estas solicitudes de sondeo del cliente. El servidor también tendrá que almacenar esos mensajes en algún lugar, de modo que cuando los mensajes estén listos, el servidor pueda entregarlos. A un nivel muy simple, su servidor necesita:

  • Aceptar solicitudes web generales.
  • Aceptar solicitudes de sondeo
  • Ejecutar trabajos en segundo plano que recuperan mensajes
  • Almacene estos mensajes en algún lugar para que cuando lleguen las solicitudes de sondeo, el servidor pueda verificarlos.

También deberá vincular estas solicitudes de sondeo con algún tipo de ID de sesión para el usuario, de modo que los mensajes correctos lleguen a la persona adecuada. En general, el paradigma es complicado y, en mi opinión, ineficiente.

Web Sockets

Los sockets web son nuevos para HTML5. La idea básica detrás de ellos es que el Cliente puede mantener una conexión directa con el servidor y pueden enviar información de un lado a otro. Por lo tanto, en lugar de lo habitual: los clientes envían una solicitud GET >> El servidor responde con contenido, Web Sockets le permite mantener un diálogo continuo.

Para configurar esto, sin embargo, necesitas:

  • Navegadores que son compatibles con WebSocket (no todos lo son).
  • Un servidor que puede manejar sockets web (no estoy seguro de cómo articular esto, pero no todos los servidores están configurados para este tipo de disposición).

La configuración es algo complicada, aunque más simple que un sondeo largo:

  • El cliente mantiene la conexión a la conexión habilitada para Web-Socket al servidor
  • El servidor envía los resultados al cliente a través de un socket web
  • Página de actualizaciones del cliente según resultados.

Verá este patrón denominado Notificaciones de inserción (sin duda, si posee un iPhone que lo haya experimentado), ya que el Servidor ha sido habilitado para enviar “cosas” al cliente (¡qué descortés!). Como hay muchos matices de clientes y servidores, recomendaría probar algo como Pusher , que es básicamente un servicio web para manejar todas las partes difíciles de Web Sockets. Será una forma fácil para que pruebes y juegues con el patrón antes de embarcarte en configurarlo tú mismo. Tiene bibliotecas tanto del lado del cliente como del servidor.

Espero que la información le brinde una línea de base para resolver su problema. Las otras respuestas tienen información más directa sobre cómo resolver cada escenario.

Cometa / larga encuesta

Un enfoque alternativo, aparentemente de navegador cruzado para Web Sockets es el sondeo largo (ver Comet ). En este caso, su cliente establece una conexión con el servidor y lo deja colgado, a la espera de que los datos se devuelvan. La configuración para esto es algo complicada, pero representa un punto medio entre Short Polling y Web Sockets .

Yo sugeriría implementar una conexión tipo socket utilizando SockJS o Socket.io como la biblioteca de JavaScript del lado del cliente y luego usar Tornado en el lado del servidor para publicar cualquier cambio de estado en el cliente. El código es bastante simple.

El código del lado del cliente depende de la biblioteca que elija. SockJS o SocketIO. O si solo quieres usar Websockets directamente es muy simple:

 update_socket = new WebSocket("ws://my_server.com/listening_url"); update_socket.onmessage = function (evt) { $("#my_div").html(evt); }; 

El código del lado del servidor también es bastante simple:

 import tornado class UpdateHandler(tornado.websocket.WebSocketHandler): def open(self): self.write_message('Hi client') # listen for some events that are occurring for message in function_that_generates_events(): self.write(message) def on_message(self, message): # Do something with incoming messages def on_close(self): # tidy up app = tornado.web.Application(('r/listening_url',UpdateHandler)) app.listen(9000) 

Puede usar una encuesta, una encuesta larga o si desea un sistema de inserción. Más fácil sería una encuesta. Sin embargo, todas las soluciones requieren la encoding del lado del cliente.

El impacto en el rendimiento depende de su solución. Más fácil de implementar sería una encuesta. Una encuesta con frecuencia corta hace efectivamente una solicitud cada, por ejemplo, 100 ms de simulación de tiempo real. Una encuesta larga sería de menor impacto, pero se mantendría abierta una gran cantidad de solicitudes durante más o menos tiempo.

Embarcadero

Motor Ajax Push

Zócalo.io

Estas son formas de implementar Comet.

Recomendaría Socket.io, que se implementa con Node.js

Porque aprovecha para utilizar el mejor método de conexión disponible.