Faye contra Socket.IO (y Juggernaut)

102

Socket.IO parece ser la biblioteca de emulación de WebSocket más popular y activa. Juggernaut lo usa para crear un pub / sub sistema completo.

Faye también es popular y activa, y tiene su propia biblioteca de JavaScript, lo que hace que su funcionalidad completa sea comparable a Juggernaut. Juggernaut usa un nodo para su servidor, y Faye puede usar un nodo o un rack. Juggernaut usa Redis para la persistencia ( corrección: usa Redis para pub / sub), y Faye solo mantiene el estado en la memoria.

  1. ¿Todo lo anterior es correcto?
  2. Faye dice que implementa Bayeux , creo que Juggernaut no hace esto, es porque Juggernaut es de nivel inferior (es decir, puedo implementar Bayeux usando Juggernaut)
  3. ¿Podría Faye cambiar al uso de la biblioteca javascript del navegador Socket.IO si quisiera? ¿O sus bibliotecas de JavaScript hacen cosas fundamentalmente diferentes?
  4. ¿Existen otras diferencias arquitectónicas / de diseño / filosóficas entre los proyectos?
John Bachir
fuente
3
¡Por si acaso, Juggernaut ha sido obsoleto! Lea por qué blog.alexmaccaw.com/killing-a-library .
Maziyar
Los eventos HTML 5 enviados por el servidor parecen ser la alternativa recomendada según el autor de Juggernaut
Harindaka

Respuestas:

121

Divulgación: soy el autor de Faye.

  1. Respecto a Faye, todo lo que has dicho es cierto.
  2. Faye implementa la mayor parte de Bayeux, lo único que falta en este momento son los canales de servicio, de los que aún no estoy convencido de su utilidad. En particular, Faye está diseñado para ser compatible con la implementación de referencia CometD de Bayeux, que tiene una gran influencia en lo siguiente.
  3. Conceptualmente, sí: Faye podría usar Socket.IO. En la práctica, existen algunas barreras para esto:
    • No tengo idea de qué tipo de soporte del lado del servidor requiere Socket.IO, y el requisito de que el cliente Faye (hay clientes del lado del servidor en Node y Ruby, recuerde) pueda hablar con cualquier servidor Bayeux (y el Faye servidor a cualquier cliente Bayeux) puede ser un factor decisivo.
    • Bayeux tiene requisitos específicos de que los servidores y los clientes admitan ciertos tipos de transporte, y dice cómo negociar cuál usar. También especifica cómo se utilizan, por ejemplo, cómo afecta el tipo de contenido de una solicitud XHR a cómo se interpreta su contenido.
    • Para algunos tipos de manejo de errores, necesito acceso directo al transporte, por ejemplo, reenviar mensajes cuando un cliente se vuelve a conectar después de que un Node WebSocket muere .
    • Por favor, corríjame si me equivoco en algo de esto, esto se basa en un escaneo superficial de la documentación de Socket.IO.
  4. Faye es solo pub / sub, solo se basa en un protocolo un poco más complejo y tiene muchas sutilezas integradas:
    • Extensiones del lado del servidor y del cliente
    • Coincidencia de patrones comodín en rutas de canales
    • Reconexión automática, por ejemplo, cuando los WebSockets mueren o el servidor se desconecta
    • El cliente funciona en todos los navegadores, en teléfonos y en el lado del servidor en Node y Ruby

Faye probablemente parece mucho más complejo en comparación con Juggernaut porque Juggernaut delega más, por ejemplo, delega la negociación de transporte a Socket.IO y el enrutamiento de mensajes a Redis. Ambas son buenas decisiones, pero mi decisión de utilizar Bayeux significa que tengo que trabajar más yo mismo.

En cuanto a la filosofía de diseño, el objetivo primordial de Faye es que debería funcionar en todos los lugares en los que la Web esté disponible y debería ser absolutamente trivial para empezar. Es realmente sencillo comenzar, pero su extensibilidad significa que se puede personalizar de maneras bastante poderosas, por ejemplo, puede convertirlo en un servicio de inserción de servidor a cliente (es decir, evitar que los clientes arbitrarios lo presionen) agregando extensiones de autenticación .

También se está trabajando para que sea más flexible en el lado del servidor. Estoy pensando en agregar soporte de agrupación en clústeres y hacer que el motor principal pub-sub sea enchufable para que pueda usar Faye como una interfaz web sin estado para otro sistema pub-sub como Redis o AMQP.

Espero que esto te haya sido de ayuda.

jcoglan
fuente
1
Gracias por una gran respuesta. No me di cuenta de la flexibilidad del protocolo Bayeux, por lo que un cliente arbitrario debería poder hablar con servidores arbitrarios / múltiples. ¿Conoce algún proyecto o servicio de producción que aproveche al máximo esto?
John Bachir
4
Recientemente me mudé de Socket.IO a Faye, y debo decir que Faye guardó mi solicitud. Con un servidor Faye simple y un servidor mediano, mi aplicación puede manejar 6000 usuarios simultáneamente según Google Analytics
Tan Nguyen
13
  1. AFAIK, sí, aparte del hecho de que Juggernaut solo usa Redis para Pubsub, no persistencia. También significa que ya se han escrito bibliotecas cliente en la mayoría de los lenguajes (ya que solo necesita un adaptador Redis).
  2. Juggernaut no implementa Bayeux, sino que tiene un protocolo JSON personalizado muy simple
  3. No sé, probablemente
  4. Juggernaut es muy simple y está diseñado para ser así. Aunque no he usado Faye, por los documentos parece que tiene muchas más funciones que solo PubSub. Estar construido sobre Socket.IO también tiene sus ventajas, Juggernaut es compatible con prácticamente todos los navegadores, tanto de escritorio como móviles.

Me interesará mucho lo que tenga que decir el autor de Faye. Como digo, no lo he usado y sería genial saber cómo se compara con Juggernaut. Probablemente sea el caso de usar la mejor herramienta para el trabajo. Si lo que necesita es pubsub, Juggernaut lo hace muy bien.

Alex MacCaw
fuente
Gracias por una gran respuesta. No me di cuenta de que Redis solo se usaba para sus funciones de pub / sub. Me hizo preguntar esto: stackoverflow.com/questions/4938520
John Bachir