2011-04-04 8 views
8

Estoy construyendo un programa de sincronización de archivos (a diferencia de Dropbox) usando node.js en ambos extremos. Necesito tener potencialmente miles de clientes que solicitan datos al mismo tiempo.HTTP vs Websockets con respecto a la sobrecarga

Aquí es mi sistema actual:

  • servidor empuja notificaciones al cliente a través de un WebSocket (archivo ha sido actualizado)
  • cliente en cola de descargas y realiza una solicitud HTTP cuando está inactivo

I estará publicando datos en fragmentos comprimidos de, digamos, 50 MB cada uno, por lo que la carga de solicitud de HTTP (encabezados) es insignificante.

Si tuviera que utilizar WebSockets para las solicitudes y notificaciones empuje, ¿habría:

  • notables mejoras generales de velocidad? (latencia reducida, autenticación, etc.)
  • ¿Sobrecarga adicional en el servidor para mantener las conexiones abiertas?
  • Problemas con el empuje de datos binarios?

Creo que necesito que las notificaciones se envíen a través de un websocket específico porque no quiero que estén en cola en el servidor mientras se está realizando una descarga (mucha sobrecarga).

Nota: Estos websockets estarán abiertos a largo plazo, siempre que el sistema del cliente esté encendido.

EDITAR: Voy a utilizar los websockets en un servidor http diferente en diferentes puertos para moverlos a diferentes núcleos de CPU. Yo podría tener potencialmente miles (si no cientos de miles) de websockets concurrentes abiertos ...

+0

"using node.js en ambos extremos" - de modo que tanto el cliente como el servidor tendrían instalado node.js? ¿El cliente no será un navegador, por ejemplo? – yojimbo87

+0

Sí, no hay navegador. Tendré control total sobre las solicitudes y respuestas. Será una aplicación de escritorio que se ejecuta en segundo plano. servidor HTTP simple, cliente HTTP simple. – tjameson

Respuesta

5

Si tiene la intención de usar node.js para el cliente y el servidor, entonces debe usar el módulo nativo net con sockets puros en lugar de WebSockets. Los conectores puros están mucho mejor optimizados para la transferencia de datos, especialmente binarios. Por lo que sé, los WebSockets del navegador ni siquiera admiten la transferencia binaria.

+1

Tendré que investigar eso. ¿Hay alguna estadística o punto de referencia que compare dos servidores equivalentes bajo alta carga? – tjameson

+0

No me refiero a ningún punto de referencia que compare los sockets puros con WebSockets, pero recientemente hubo una [pregunta] similar (http://stackoverflow.com/questions/5509905/websockets-between-2-servers) sobre este tema. – yojimbo87

+0

Sí, hay algunas bibliotecas bastante agradables, como [socket.io-node] (https://github.com/LearnBoost/Socket.IO-node). Si nadie publica ningún punto de referencia o algo más completo que tu respuesta, probablemente marque el tuyo como correcto. – tjameson

1

que estaba buscando alrededor para otra cosa y me encontré con este post que explica bastante bien websockets:

http://blog.new-bamboo.co.uk/2009/12/7/real-time-online-activity-monitor-example-with-node-js-and-websocket

Aquí hay algunas partes bastante interesantes del artículo:

Websocket le permite tener una comunicación continua en una sobrecarga de red significativamente menor en comparación con la solución existente.

Y:

Durante realizar la conexión con los datos WebSocket, cliente y el servidor intercambian por trama que es de 2 bytes cada uno, frente al 8 kilobytes de cabecera HTTP cuando haces interrogación continua.

Para mi caso de uso (sin navegador), ¡esta parece ser la solución óptima! Ahora solo necesito decidir si quiero tener un solo websocket o múltiples websockets por cliente (me estoy inclinando por uno solo en este momento).

Realmente espero que esto sea útil para alguien. Lo dejaré abierto por el momento.Asistiré a una conferencia de JS más adelante esta semana, y si aprendo algo más lo agregaré a esta publicación.

Para aquellos de ustedes que se preocupan por el soporte del navegador, consulte this. Parece que WebKit es el único motor confiable que lo admite (Chrome y Safari).

+0

Hola, tjameson, ¿te fue bien con respecto a la implementación del socket web de un proyecto de transferencia de archivos? Estoy a punto de comenzar una implementación de un proyecto similar en Python, tanto en el servidor como en el cliente. Hablando en términos prácticos, ¿es una buena práctica hacerlo en websockets o solo debo usarlo para enviar mensajes y obtener la parte de transferencia de archivos hecha en HTTP? Déjame saber tus ideas de tu experiencia. Gracias. – securecurve

+0

Dado que está usando Python, solo puedo suponer que quiere algo fácil y rápido, que es HTTP. Ofrece una gran estructura y está bien soportado. Para un proyecto Arduino, donde los datos eran bastante pequeños, implementé el protocolo WebSocket sin el protocolo de enlace HTTP. Es bastante simple (encabezado de un byte, 1-8 bytes para la longitud del mensaje) y HTTP es difícil para Arduino. Si necesita velocidad bruta, investigue eso, de lo contrario, simplemente siga con HTTP hasta que tenga problemas. – tjameson

Cuestiones relacionadas