102

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. 项目之间是否存在其他架构/设计/理念差异?
4

3 回答 3

122

披露:我是 Faye 的作者。

  1. 关于Faye,你说的都是真的。
  2. Faye 实现了 Bayeux 的大部分内容,现在唯一缺少的是服务渠道,我还没有相信它的用处。特别是 Faye 被设计为与 Bayeux 的 CometD 参考实现兼容,这对以下内容有很大影响。
  3. 从概念上讲,是的:Faye可以使用 Socket.IO。在实践中,这有一些障碍:
    • 我不知道 Socket.IO 需要什么样的服务器端支持,以及 Faye 客户端(在 Node 和 Ruby 中有服务器端客户端,记住)能够与任何 Bayeux 服务器(以及 Faye服务器到任何 Bayeux 客户端)可能会破坏交易。
    • Bayeux 有服务器和客户端支持某些传输类型的特定要求,并说明如何协商使用哪一种。它还指定了它们的使用方式,例如 XHR 请求的 Content-Type 如何影响其内容的解释方式。
    • 对于某些类型的错误处理,我需要直接访问传输,例如在 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 前端。

希望这有用。

于 2011-02-04T11:02:36.800 回答
13
  1. AFAIK,是的,除了 Juggernaut 仅将 Redis 用于 Pubsub 而非持久性这一事实之外。也意味着大多数语言的客户端库已经编写好了(因为它只需要一个 Redis 适配器)。
  2. Juggernaut 没有实现 Bayeux,而是有一个非常简单的自定义 JSON 协议
  3. 我不知道,但可能
  4. 剑圣非常简单,设计就是这样。虽然我没有使用过 Faye,但从文档看来,它的功能远不止 PubSub。建立在 Socket.IO 之上也有它的优势,几乎所有浏览器都支持 Juggernaut,包括桌面版和移动版。

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

于 2011-02-04T04:26:26.307 回答
3

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

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

于 2011-02-04T01:54:57.367 回答