socket nodejs ejemplo javascript html5 xmlhttprequest websocket long-polling

javascript - nodejs - Websockets. Pérdida de internet, mensajes de mantenimiento, arquitectura de aplicaciones, etc.



websocket php y html5 (2)

Bueno, hay mucha información sobre websockets. La tecnología en sí es increíble, no hay duda de esto. Y antes de que comience a usarlos en mi aplicación, solo quiero que la comunidad responda estas preguntas:

"... para mantener la presencia, la aplicación puede enviar mensajes de mantenimiento en el WebSocket para evitar que se cierre debido a un tiempo de espera inactivo ..."

"... idealmente, una versión futura de WebSocket admitirá el tiempo de espera de descubrimiento, por lo que puede indicar a la aplicación el período para los mensajes de mantenimiento ..."

  1. Esto se siente como deja vu. Anteriormente tuvimos que sondear el servidor una vez a% period_time% para obtener la información actualizada necesaria. Con los websockets tenemos que sondear el servidor websocket una vez un% period_time% con mensajes de mantenimiento para asegurarnos de que la conexión a Internet sigue activa / el servidor websocket sigue funcionando. ¿Cuál es el beneficio?

    Y otra cosa con respecto a estos mensajes de mantener viva. El protocolo Websocket tiene la ventaja de usar menos tráfico que HTTP (S). Si enviamos mensajes de mantenimiento, parece que la ventaja del tráfico desaparece. ¿O tal vez no?

  2. ¿Cómo debo manejar la pérdida de Internet en mi aplicación si uso websockets? Me refiero a la situación real cuando la conexión a Internet se pierde repentinamente (me refiero a que no ha ocurrido ningún evento "navigator.offline"). ¿Debo usar algún tipo de función setTimeout para buscar mensajes de mantenimiento o hay una mejor manera de manejar esta situación?

  3. REST nos brinda una comprensión clara de cómo debería funcionar una aplicación y cómo deberían ser las solicitudes. ¿Cuál es la mejor manera de hacer esto en las aplicaciones basadas en websocket? ¿Debo tener (por ejemplo) mensajes codificados en JSON con request.action en el campo? ¿Y cómo debería la aplicación realizar solicitudes PUT? Hay recursos de URL en el modelo REST para manejar esto, así que ¿debería usar una combinación de estos enfoques o quizás hay algo más simple?


"Por favor, deje de decir palabras comunes y diga cuántos casos prácticos reales de usar websockets en aplicaciones listas para producción, ¿sabe usted, excepto los chats y las aplicaciones de bolsa?"

He usado websockets para soporte multijugador en un juego de acción de naves espaciales. Websockets es una tecnología realmente genial, pero también me resulta frustrantemente impredecible, lo que probablemente es solo que soy un principiante y cometo algunos errores. Si hubiera resuelto más errores, podría haber puesto un enlace, pero se bloquea demasiado, por lo que no lo tengo en un servidor activo en este momento.

Supongo que eso lo calificaría como una aplicación preparada para NO-producción, pero hipotéticamente no veo por qué alguien más con más experiencia ya no lo habría hecho bien.


Creo que la mayoría de sus preguntas se pueden aclarar al comprender el verdadero propósito de WebSockets. WebSockets no fue diseñado principalmente para reemplazar ninguna de las cosas que ya están en su lugar y que funcionan bien. Por ejemplo, no fue diseñado para ser una versión de bajo costo de AJAX. El propósito es proporcionar un canal de comunicación bidireccional, de baja latencia, dúplex completo, entre el navegador y el servidor. Su propósito real es habilitar un nuevo dominio de aplicaciones web o mejorar las actuales que abusan de HTTP para lograr la comunicación bidireccional.

Con eso en mente, permítanme comentar sus puntos:

  1. El propósito de los mensajes periódicos de ping / pong de WebSockets es doble: evitar que el canal se cierre por el tiempo de espera de TCP y detectar más rápidamente cuándo se cierra el canal (esto es históricamente una debilidad de TCP). El propósito del sondeo HTTP / AJAX es evitar el hecho de que HTTP no es bidireccional (es decir, el sondeo del cliente para dar al servidor la oportunidad de devolver datos). Los marcos de ping / pong de WebSocket tienen generalmente 2 bytes de longitud. El sondeo HTTP / AJAX requiere encabezados completos, cookies, etc., que pueden sumar fácilmente más de un kilobyte para cada solicitud / respuesta. Incluso si envía un ping / pong 10 veces por segundo a través de WebSockets, es poco probable que incluso se compare con la sobrecarga del sondeo HTTP / AJAX cada 2 segundos. Sin embargo, tenga en cuenta que las aplicaciones no tienen la capacidad de enviar mensajes de ping / pong. Esto es entre el navegador y el servidor.

  2. Si pierde la conexión a Internet, recibirá un evento onclose. Si su navegador no le está enviando mensajes de ping / pong, es posible que no reciba un cierre hasta que intente enviar un mensaje después de que la conexión de red se interrumpa.

  3. No reemplazaría un servicio RESTful en funcionamiento con WebSockets. Usted estaría haciendo un montón de trabajo de mapeo para un beneficio probablemente muy pequeño (de nuevo, WebSockets no está diseñado para reemplazar lo que ya está funcionando bien). Puedo imaginar situaciones en las que podría tener una combinación de ambos: REST para transferencia de estado, WebSockets para notificación de eventos. Por ejemplo, el servidor envía un mensaje WebSocket que indica "algo cambió", lo que hace que el cliente realice una solicitud REST para averiguar el cambio.

Actualización :

Aclaración: podría hacer REST a través de WebSockets, pero es una falta de coincidencia en la filosofía. REST es un estilo de arquitectura que no tiene opiniones sobre el sistema de transporte subyacente. Es una arquitectura restringida: "cliente-servidor", "sin estado", "almacenable en caché", "sistema en capas", "código a pedido" e "interfaz uniforme". WebSockets no está limitado por ninguno de esos; Es un sistema de transporte de mensajes genérico. Podría restringir a WebSockets para que sea RESTO, pero no lo haga hasta que entienda íntimamente tanto a REST como a WebSockets y pueda identificar cuándo es correcto hacerlo.