【问题标题】:Faye vs. Socket.IO (and Juggernaut)Faye 与 Socket.IO(和剑圣)
【发布时间】:2011-06-21 02:13:00
【问题描述】:

Socket.IO 似乎是最流行和最活跃的 WebSocket 仿真库。 Juggernaut 用它来创建一个完整的发布/订阅系统。

Faye 也很受欢迎和活跃,并且拥有自己的 javascript 库,使其完整的功能可以与剑圣相媲美。 Juggernaut 使用节点作为其服务器,而 Faye 可以使用节点或机架。 Juggernaut 使用 Redis 进行持久化(更正: 它使用 Redis 进行发布/订阅),而 Faye 仅将状态保存在内存中。

  1. 以上所有内容都准确吗?
  2. Faye 说它实现了Bayeux——我认为 Juggernaut 没有这样做——因为 Juggernaut 级别较低(IE,我可以使用 Juggernaut 实现 Bayeux)
  3. 如果 Faye 愿意,是否可以切换到使用 Socket.IO 浏览器 JavaScript 库?还是他们的 javascript 库做了根本不同的事情?
  4. 项目之间是否存在其他架构/设计/理念差异?

【问题讨论】:

  • 以防万一,剑圣已被弃用!阅读为什么blog.alexmaccaw.com/killing-a-library
  • 根据 Juggernaut 作者的说法,HTML 5 服务器发送事件似乎是推荐的替代方案

标签: websocket publish-subscribe juggernaut bayeux socket.io


【解决方案1】:

披露:我是 Faye 的作者。

  1. 关于王菲,你说的都是真的。
  2. Faye 实现了 Bayeux 的大部分功能,现在唯一缺少的是服务通道,我还没有确信它的用处。尤其是 Faye 旨在与 Bayeux 的 CometD 参考实现兼容,这对以下内容有很大影响。
  3. 从概念上讲,是的:Faye 可以使用 Socket.IO。在实践中,这有一些障碍:
    • 我不知道 Socket.IO 需要什么样的服务器端支持,以及 Faye 客户端(在 Node 和 Ruby 中有服务器端客户端,记住)能够与任何 Bayeux 服务器通信的要求(和任何 Bayeux 客户端的 Faye 服务器)可能会破坏交易。
    • Bayeux 有服务器和客户端支持某些传输类型的特定要求,并说明如何协商使用哪一种。它还指定了它们的使用方式,例如 XHR 请求的 Content-Type 如何影响其内容的解释方式。
    • 对于某些类型的错误处理,我需要直接访问传输,例如resending messages when a client reconnects after a Node WebSocket dies
    • 如果我有任何错误,请纠正我 - 这是基于对 Socket.IO 文档的粗略扫描。
  4. Faye 只是 pub/sub,它只是基于稍微复杂一点的协议,并且内置了很多细节:
    • 服务器端和客户端扩展
    • 通道路由上的通配符模式匹配
    • 自动重新连接,例如当 WebSockets 死掉或服务器离线时
    • 客户端适用于所有浏览器、手机以及 Node 和 Ruby 上的服务器端

与 Juggernaut 相比,Faye 看起来可能要复杂得多,因为 Juggernaut 委托更多,例如它将传输协商委托给 Socket.IO,并将消息路由委托给 Redis。这些都是不错的决定,但我决定使用 Bayeux 意味着我必须自己做更多的工作。

至于设计理念,Faye 的首要目标是它应该适用于 Web 可用的任何地方,并且应该绝对容易上手。我上手真的很简单,但它的可扩展性意味着它可以通过非常强大的方式进行定制,例如,您可以通过添加身份验证扩展将其变成服务器到客户端的推送服务(即停止任意客户端推送) .

还有一些工作正在进行中,以使其在服务器端更加灵活。我正在考虑添加集群支持,并使核心 pub-sub 引擎可插入,以便您可以将 Faye 用作另一个 pub-sub 系统(如 Redis 或 AMQP)的无状态 Web 前端。

我希望这会有所帮助。

【讨论】:

  • 感谢您的精彩回答。我没有意识到 Bayeux 协议的灵活性——所以任意客户端应该能够与任意/多个服务器通信?您知道充分利用这一点的任何项目或生产服务吗?
  • 我最近从 Socket.IO 搬到了 Faye,我必须说 Faye 保存了我的应用程序。使用一个简单的 Faye 服务器和一个中型服务器,根据谷歌分析,我的应用程序可以同时处理 6000 个用户
【解决方案2】:
  1. AFAIK,是的,除了 Juggernaut 仅将 Redis 用于 Pubsub 而非持久性这一事实。也意味着大多数语言的客户端库已经编写好了(因为它只需要一个 Redis 适配器)。
  2. Juggernaut 没有实现 Bayeux,而是有一个非常简单的自定义 JSON 协议
  3. 我不知道,但可能
  4. Juggernaut 非常简单,设计就是这样。虽然我没有使用过 Faye,但从文档看来,它的功能远不止 PubSub。建立在 Socket.IO 之上也有它的优势,几乎所有浏览器都支持 Juggernaut,包括桌面版和移动版。

我会对 Faye 的作者所说的话非常感兴趣。正如我所说,我没有使用它,很高兴知道它与剑圣相比如何。这可能是使用最好的工具来完成工作的情况。如果您需要的是 pubsub,那么 Juggernaut 就做得很好。

【讨论】:

【解决方案3】:

Faye 当然可以。 另一个基于 Socket.IO 的类似项目示例:

https://github.com/aaronblohowiak/Push-It

【讨论】:

    猜你喜欢
    • 2011-03-15
    • 2011-12-12
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多