Faye contre Socket.IO (et Juggernaut)

102

Socket.IO semble être la bibliothèque d'émulation WebSocket la plus populaire et la plus active. Juggernaut l' utilise pour créer un système pub / sous complet.

Faye est également populaire et actif, et possède sa propre bibliothèque javascript, ce qui rend sa fonctionnalité complète comparable à Juggernaut. Juggernaut utilise node pour son serveur, et Faye peut utiliser node ou rack. Juggernaut utilise Redis pour la persistance ( correction: il utilise Redis pour pub / sub), et Faye ne garde l'état qu'en mémoire.

  1. Tout ce qui précède est-il exact?
  2. Faye dit qu'il implémente Bayeux - je pense que Juggernaut ne le fait pas - est que parce que Juggernaut est de niveau inférieur (IE, je peux implémenter Bayeux en utilisant Juggernaut)
  3. Faye pourrait-elle passer à l'utilisation de la bibliothèque javascript du navigateur Socket.IO si elle le voulait? Ou leurs bibliothèques javascript font-elles des choses fondamentalement différentes?
  4. Existe-t-il d'autres différences architecturales / de conception / de philosophie entre les projets?
John Bachir
la source
3
Au cas où, Juggernaut est obsolète! Lisez pourquoi blog.alexmaccaw.com/killing-a-library .
Maziyar
Les événements HTML 5 envoyés par le serveur semblent être l'alternative recommandée selon l'auteur de Juggernaut
Harindaka

Réponses:

121

Divulgation: Je suis l'auteur de Faye.

  1. En ce qui concerne Faye, tout ce que vous avez dit est vrai.
  2. Faye implémente la majeure partie de Bayeux, la seule chose qui manque pour l'instant, ce sont les canaux de service, dont je n'ai pas encore été convaincu de l'utilité. En particulier, Faye est conçu pour être compatible avec l'implémentation de référence CometD de Bayeux, qui a une grande incidence sur les éléments suivants.
  3. Conceptuellement, oui: Faye pourrait utiliser Socket.IO. Dans la pratique, il existe des obstacles à cela:
    • Je n'ai aucune idée du type de support côté serveur requis par Socket.IO, et de l'exigence que le client Faye (il y a des clients côté serveur dans Node et Ruby, rappelez-vous) puisse parler à n'importe quel serveur Bayeux (et le Faye serveur à n'importe quel client de Bayeux) peut être un facteur décisif.
    • Bayeux a des exigences spécifiques selon lesquelles les serveurs et les clients prennent en charge certains types de transport, et explique comment négocier celui à utiliser. Il spécifie également comment ils sont utilisés, par exemple comment le Content-Type d'une requête XHR affecte la manière dont son contenu est interprété.
    • Pour certains types de gestion des erreurs, j'ai besoin d'un accès direct au transport, par exemple le renvoi de messages lorsqu'un client se reconnecte après la mort d'un nœud WebSocket .
    • Veuillez me corriger si je me trompe - ceci est basé sur une analyse rapide de la documentation Socket.IO.
  4. Faye est juste un pub / sous-marin, il est juste basé sur un protocole légèrement plus complexe et a beaucoup de subtilités intégrées:
    • Extensions côté serveur et côté client
    • Correspondance de motifs génériques sur les itinéraires de canal
    • Reconnexion automatique, par exemple lorsque les WebSockets meurent ou que le serveur se déconnecte
    • Le client fonctionne dans tous les navigateurs, sur les téléphones et côté serveur sur Node et Ruby

Faye semble probablement beaucoup plus complexe que Juggernaut parce que Juggernaut délègue davantage, par exemple il délègue la négociation de transport à Socket.IO et le routage des messages à Redis. Ce sont deux bonnes décisions, mais ma décision d'utiliser Bayeux signifie que je dois faire plus de travail moi-même.

En ce qui concerne la philosophie de conception, l'objectif primordial de Faye est qu'elle devrait fonctionner partout où le Web est disponible et qu'elle devrait être absolument simple à utiliser. C'est vraiment simple pour commencer, mais son extensibilité signifie qu'il peut être personnalisé de manière assez puissante, par exemple, vous pouvez le transformer en un service push de serveur à client (c'est-à-dire arrêter les clients arbitraires qui y poussent) en ajoutant des extensions d'authentification .

Des travaux sont également en cours pour le rendre plus flexible côté serveur. Je cherche à ajouter la prise en charge du clustering et à rendre le moteur de pub-sub de base enfichable afin que vous puissiez utiliser Faye comme interface Web sans état pour un autre système de pub-sub comme Redis ou AMQP.

J'espère que cela a été utile.

jcoglan
la source
1
Merci pour une excellente réponse. Je n'avais pas réalisé la flexibilité du protocole de Bayeux - donc un client arbitraire devrait être capable de parler à des serveurs arbitraires / multiples? Connaissez-vous des projets ou des services de production qui en profitent pleinement?
John Bachir
4
J'ai récemment déménagé de Socket.IO à Faye, et je dois dire que Faye a sauvegardé ma candidature. Avec un simple serveur Faye et un serveur moyen, mon application peut gérer 6000 utilisateurs simultanément selon google analytics
Tan Nguyen
13
  1. AFAIK, oui, mis à part le fait que Juggernaut utilise uniquement Redis pour Pubsub, pas la persistance. Cela signifie également que les bibliothèques clientes dans la plupart des langues ont déjà été écrites (car il suffit d'un adaptateur Redis).
  2. Juggernaut n'implémente pas Bayeux, mais a plutôt un protocole JSON personnalisé très simple
  3. Je sais pas, probablement
  4. Juggernaut est très simple et conçu pour être ainsi. Bien que je n'ai pas utilisé Faye, d'après la documentation, il semble qu'il ait beaucoup plus de fonctionnalités que PubSub. Le fait d'être construit sur Socket.IO présente également des avantages, Juggernaut est pris en charge dans pratiquement tous les navigateurs, à la fois de bureau et mobiles.

Je serai vraiment intéressé par ce que l'auteur de Faye a à dire. Comme je l'ai dit, je ne l'ai pas utilisé et ce serait formidable de savoir comment il se compare à Juggernaut. C'est probablement le cas d'utiliser le meilleur outil pour le travail. Si c'est un pub dont vous avez besoin, Juggernaut le fait très bien.

Alex MacCaw
la source
Merci pour une excellente réponse. Je ne savais pas que Redis n'était utilisé que pour ses fonctionnalités pub / sous. M'a fait demander ceci: stackoverflow.com/questions/4938520
John Bachir