我最近遇到了关于内存泄漏和扩展问题的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标记)这里)。
您更喜欢哪两个图书馆?出于哪个原因?你在生产中使用它们吗?
未来哪一个可能会更积极地维持并且可能比另一个更具优势?
答案 0 :(得分:5)
你看过Primus了吗?它提供了您提到的cookie要求,它支持所有可用的major'实时' / websocket库,是一个非常活跃的项目。对我而言,听起来像供应商锁定可能是你的担忧,而Primus会解决这个问题。
它使用plugin system的事实也应该a)使你更容易扩展,如果需要和b)实际上可能有community plugin已经做你需要的。
您更喜欢哪两个图书馆?出于哪个原因?你在生产中使用它们吗?
我只通过Vert.x API使用了SockJS,它是一个内部项目,我会考虑'生产',但不是面向生产的消费者应用程序。也就是说,它表现得非常好。
未来哪一个可能会更积极地维持并且可能比另一个更具优势?
只是查看Engine.io和SockJS的提交历史,以及Auttomatic支持Engine.io的事实让我倾向于认为它会更稳定,持续更长的时间,但当然这是值得商榷的。查看Engine.io和SockJS的问题是另一个值得评估的好地方,但由于它们都是分散在多个回购中,因此应该采取一些措施。我不确定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)。