Faye vs. Socket.IO(和Juggernaut)

103

Socket.IO 似乎是最受欢迎和活跃的 WebSocket 模拟库。 Juggernaut 使用它来创建完整的发布/订阅系统。

Faye 也很受欢迎和活跃,并且有自己的 JavaScript 库,使其完整功能与 Juggernaut 可比较。Juggernaut 使用 node 作为其服务器,而 Faye 可以使用 node 或 rack。Juggernaut 使用 Redis 进行持久化(更正:它使用 Redis 进行发布/订阅),而 Faye 只在内存中保留状态。

  1. 以上全部准确吗?
  2. Faye 表示其实现了Bayeux -- 我认为 Juggernaut 并没有做到这一点--这是因为 Juggernaut 更低级(即,我可以使用 Juggernaut 实现 Bayeux)吗?
  3. 如果愿意,Faye 是否可以切换到使用 Socket.IO 浏览器 JavaScript 库?或者他们的 JavaScript 库基本上做不同的事情?
  4. 这些项目之间是否存在其他架构/设计/哲学差异?

3
以防万一,Juggernaut已被弃用!阅读原因:http://blog.alexmaccaw.com/killing-a-library。 - Maziyar
HTML 5服务器发送事件似乎是Juggernaut作者推荐的替代方案。 - Harindaka
3个回答

124

声明:本人是Faye的作者。

  1. 关于Faye,你说的都是真的。
  2. Faye实现了大部分Bayeux协议,目前唯一缺少的是服务通道,我还没有被其有用性所说服。特别是,Faye旨在与CometD Bayeux的参考实现兼容,在以下方面具有重要影响。
  3. 从概念上讲,是的:Faye 可以 使用Socket.IO。但在实践中,有一些障碍:
    • 我不知道Socket.IO需要什么样的服务器支持,而且Faye客户端(请记住,Node和Ruby中有服务器端客户端)必须能够与任何Bayeux服务器通信(Faye服务器与任何Bayeux客户端通信),这可能是无法克服的问题。
    • Bayeux对服务器和客户端支持某些传输类型有特定要求,并说明如何协商使用哪种类型。 它还指定了它们的使用方式,例如XHR请求的Content-Type如何影响其内容的解释。
    • 对于某些类型的错误处理,我需要直接访问传输,例如当Node WebSocket失败后,客户端重新连接时重新发送消息
    • 如果我的理解有误,请纠正我-这是基于对Socket.IO文档的简要扫描。
  4. Faye只是发布/订阅模式,它仅基于稍微复杂一些的协议,并具有许多便利功能:
    • 服务器和客户端扩展
    • 通道路由上的通配符模式匹配
    • 自动重新连接,例如当WebSockets失败或服务器离线时
    • 客户端在所有浏览器、手机和Node和Ruby的服务器端都可以使用

相比于Juggernaut,Faye可能看起来更加复杂,因为Juggernaut会委托更多的工作,例如将传输协商委托给Socket.IO,将消息路由委托给Redis。这些都是很好的决定,但我选择使用Bayeux意味着我必须自己多做一些工作。

至于设计理念,Faye的主要目标是在Web可用的任何地方都应该能够工作,并且应该非常容易上手。它非常简单易用,但其可扩展性意味着可以以相当强大的方式进行定制,例如通过添加认证扩展,可以将其转换为服务器到客户端推送服务(即停止任意客户端向其中推送)。

目前也有正在进行的工作,旨在使其在服务器端更加灵活。我正在考虑添加集群支持,并使核心发布-订阅引擎可插拔,这样您就可以将Faye用作另一个发布-订阅系统(如Redis或AMQP)的无状态Web前端。

希望这对你有所帮助。


1
感谢您提供的出色答案。我没有意识到Bayeux协议的灵活性 - 所以任意客户端应该能够与任意/多个服务器通信?您是否知道有哪些项目或生产服务充分利用了这一点? - John Bachir
4
我最近从 Socket.IO 转用 Faye,我必须说 Faye 拯救了我的应用。仅用一个简单的 Faye 服务器和一个中等规模的服务器,我的应用可以根据 Google Analytics 同时处理 6000 个用户。 - Tan Nguyen

13
  1. 据我所知,是的,除了Juggernaut仅使用Redis作为Pubsub而不进行持久化之外。这也意味着大多数语言的客户端库已经编写好了(因为它只需要一个Redis适配器)。
  2. Juggernaut没有实现Bayeux,而是有一个非常简单的自定义JSON协议。
  3. 我不知道,但很可能会有。
  4. Juggernaut非常简单,并且被设计成这样。虽然我没有使用Faye,但从文档中可以看出它拥有比仅仅PubSub更多的功能。 以Socket.IO为基础构建还有优势,Juggernaut在几乎所有桌面和移动浏览器上都得到了支持。

我对Faye的作者有很大兴趣。正如我所说,我没有使用过它,很想知道它与Juggernaut的比较情况。使用最合适的工具可能是正确的选择。如果你需要pubsub,Juggernaut做得非常好。


感谢您提供出色的答案。我没有意识到Redis只用于其发布/订阅功能。这让我想到了这个问题:https://dev59.com/WW445IYBdhLWcg3wTIZf - John Bachir

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接