35

我最近在 Socket.io 上遇到了关于内存泄漏和扩展问题的麻烦。我决定使用 Socket.io 是在一年前做出的,当时它无疑是最好的库。

现在 Socket.io 引起了很多麻烦,我花时间寻找同时可用的替代方案,并认为 Engine.io 和 SockJS 通常都非常适合我。但是,在我看来,两者都有一些缺点,我不确定该选择哪一个。

Engine.io 基本上是 Socket.io 的完美轻量级版本,它不包含我不需要的所有功能。我已经为 Socket.io 编写了自己的重新连接和心跳逻辑,因为我对默认逻辑不满意,而且我从未打算使用 Socket.io 提供的房间或其他功能。

但是 - 在我看来 - Engine.io 的主要缺点是建立连接的方式。客户端从较慢的 jsonp-polling 开始,如果它们支持更好的传输,则会升级。与使用过时浏览器的客户端相比,原生支持 websockets 的客户端(数量稳步增加)的缺点是连接过程更长且不稳定,这与我对如何处理它的感觉相矛盾。

另一方面,SockJS 完全按照我的意愿处理连接。从我读到的内容来看,它似乎相当稳定,而 Engine.io 目前有一些问题。

我的应用程序在单个域上的 Nginx 路由器后面运行,因此我不需要 SockJS 提供的跨域功能。然而,由于提供了这个功能,SockJS 根本不会暴露客户端的 cookie 数据。到目前为止,我通过 cookie 和查询字符串令牌对 Socket.io 进行了 2 因素授权,而这对于 SockJS 是不可能的(使用 Engine.io 会)。

我已经阅读了几乎所有可用的内容以及两者的优缺点,但到目前为止似乎没有太多讨论或发布,尤其是关于 Engine.io (这里只有 8 个用 engine.io 标记的问题)。

  • 您更喜欢这两个库中的哪一个,出于什么原因?你在生产中使用它们吗?

  • 哪一个可能会得到更积极的维护,并且将来可能比另一个更有优势?

4

3 回答 3

5

你看过普里莫斯吗?它提供了您提到的 cookie 要求,它支持所有可用的主要“实时”/websocket 库,并且是一个非常活跃的项目。在我看来,供应商锁定也可能是您担心的问题,Primus 会解决这个问题。

它使用插件系统的事实也应该 a) 使您在需要时更容易扩展,并且 b) 实际上可能有一个社区插件已经可以满足您的需要。

您更喜欢这两个库中的哪一个,出于什么原因?你在生产中使用它们吗?

我只通过 Vert.x API 使用了 SockJS,它是用于我认为是“生产”的内部项目,而不是面向生产的消费者应用程序。也就是说,它表现得非常好。

哪一个可能会得到更积极的维护,并且将来可能比另一个更有优势?

仅查看Engine.ioSockJS的提交历史,以及 Autotomatic支持 Engine.io 的事实让我倾向于认为它会在更长的时间内更稳定,但这当然是有争议的。查看Engine.ioSockJS的问题是另一个评估的好地方,但由于它们都分为多个存储库,因此应该持保留态度。我不确定 Automattic 在哪里/如何使用 Engine/Socket.io,但如果它在 WordPress.com 或他们的插件之一中,它具有大量的大规模生产战斗测试。

编辑:更改答案以反映 Primus 作者在下面的评论中确认的 cookie 支持

于 2014-08-31T14:23:30.563 回答
1

我想将您重定向到这个(非常详细的)关于 SockJS 和 Engine.io 的讨论线程

https://groups.google.com/forum/#!topic/sockjs/WSIDcY14ciI

基本上,

SockJS 在将连接标记为打开之前检测工作传输。Engine.io 将立即打开连接并稍后对其进行升级。

flash,Engine.io 后备之一(在 SockJS 中存在)加载缓慢,并且在代理后面的环境中需要 3 秒才能超时。

SockJS 不使用 flash,因此不需要解决这个问题。

SockJS 在启动时进行升级。之后,您将获得一致的体验。你发送你发送的东西,你收到你收到的东西。

此外,据我所知,engine.io 的 engine.io-client(客户端)库不支持 requirejs 构建,所以这是另一个负面因素。(SockJS 确实可以完美构建)。

于 2014-07-19T10:52:55.673 回答
0

您也可以考虑node-walve。完成 WebSocket 基础。完全基于流的性能非常好。

如何使用示例:

walve.createServer(function(wsocket) {
  wsocket.on('incoming', function(incoming) {
    incoming.pipe(process.stdout, { end: false });
  });
}).listen(server);

如果您在 nodejs 环境中感到不安全(例如扩展 API 糖的原型),它可能不是最佳选择,为项目做出贡献(尽管代码作为 socket.io 更具可读性)。

于 2014-03-03T16:40:07.960 回答