Engine.io或SockJS,哪一个可供选择?

时间:2014-03-02 21:54:49

标签: websocket socket.io comparison sockjs engine.io

我最近遇到了关于内存泄漏和扩展问题的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进行了双因素授权,这对于SockJS是不可能的(使用Engine.io)。

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

  • 您更喜欢哪两个图书馆?出于哪个原因?你在生产中使用它们吗?

  • 未来哪一个可能会更积极地维持并且可能比另一个更具优势?

3 个答案:

答案 0 :(得分:5)

你看过Primus了吗?它提供了您提到的cookie要求,它支持所有可用的major'实时' / websocket库,是一个非常活跃的项目。对我而言,听起来像供应商锁定可能是你的担忧,而Primus会解决这个问题。

它使用plugin system的事实也应该a)使你更容易扩展,如果需要和b)实际上可能有community plugin已经做你需要的。

  

您更喜欢哪两个图书馆?出于哪个原因?你在生产中使用它们吗?

我只通过Vert.x API使用了SockJS,它是一个内部项目,我会考虑'生产',但不是面向生产的消费者应用程序。也就是说,它表现得非常好。

  

未来哪一个可能会更积极地维持并且可能比另一个更具优势?

只是查看Engine.ioSockJS的提交历史,以及Auttomatic支持Engine.io的事实让我倾向于认为它会更稳定,持续更长的时间,但当然这是值得商榷的。查看Engine.ioSockJS的问题是另一个值得评估的好地方,但由于它们都是分散在多个回购中,因此应该采取一些措施。我不确定Automattic在何处/如何使用Engine / Socket.io,但如果它在WordPress.com或其中一个插件中,则会进行大规模的生产大规模战斗测试。

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

答案 1 :(得分:1)

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

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

基本上,

  

SockJS在标记连接之前检测工作传输   开放。 Engine.io将立即打开连接并升级   以后。

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

   SockJS不使用闪存,因此无需解决   这个问题。

  SockJS在启动时进行升级。之后你就拥有了   一致的经验。你发送的是你发送的内容   你得到了什么。

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

答案 2 :(得分: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)。

相关问题