使用Redis存储库扩展Engine.IO(vs. Socket.IO)

关于这个话题有几个问题,但没有一个能够解决这个问题。

我正在使用一个redis-store的Socket.IO,我正在准备在交通中碰撞。 我的托pipe公司说:“你需要使用Engine.IO而不是Socket.IO,因为它更有效率”,所以我争先恐后地弄清楚这意味着什么。

像这样的问题似乎有矛盾的答案:

  • Socket.IO构build在Engine.IO之上
  • Engine.IO增强了Socket.IO降级的地方
  • Socket.IO 1.0将成为在Engine.IO上运行的第一个版本

所以我看到它的方式:

  • Socket.IO 0.9降级
  • Engine.IO增强
  • Socket.IO 1.0将使用Engine.IO
  • 如果您想在多个实例上运行Engine.IO,则必须自己编写该Redis存储

不过, Engine.IO说这是“负载平衡友好”,但没有提到redis。 它必须有某种外部商店,对吧? 但是如果它有多个传输和一个存储,Socket.IO有什么意义呢?

然后我看到Socket.IO 可能会被抛弃 , 高调的公司正在转向 Primus 。

我如何去缩放Engine.IO? 我必须自己写商店吗?

只是想分享我在上周学到的东西,但是希望有人来,并且明确地回答这个问题,所以我可以给他们一张支票。

1)不要使用Socket.IO(从0.9.16开始)

我的主机是正确的告诉我使用Engine.IO(或其他)。 Socket.IO有大量的主要问题,其中最糟糕的是它会意外地对您的服务器进行DDoS攻击 。 我经历了相对较less的客户端的第一手,它完全禁用我的服务器,直到我可以重写closuresSocket.IO。 我缩放到25个以上的无人机来吸收这个打击,这并不重要。 一个客户端可以每秒发送1000个请求。

2)其他引擎没有Redis存储

Socket.IO允许您通过放入其Redis存储区跨节点进行广播。 据我所知,Engine.IO,Primus和SockJS不提供这个function。 所以当这些引擎声称“负载平衡器”友好时,并不意味着你可以跨节点进行广播。 我开始认为这实际上是一件好事。 用redis写pub / sub是比较容易的,把它分离出来一直不错。

我最终使用Primus与Engine.IO ,然后使用redis pub / sub共享节点之间的事件。 我花了大约5个小时去掉Socket.IO,连接了Primus,写了pub / sub,然后上线。 到目前为止,这是一个更好的经验。

更新:

结束Engine.IO也进入重新连接循环(每秒几个),所以我最终使用SockJS。 它给了我最好的连接性和稳定性, Primus现在处理重新连接 (SockJS不这样做)。

我同意,应该避免使用Socket.IO,直到v1.0发布,这是错误的,在我的testing中,Engine.IO执行得更好( https://medium.com/node-js-javascript/b63bfca0539 )。 Primus也是一个不错的select:也许你现在会使用Engine.IO,但是当Socket.IO 1.0发布的时候,你需要切换到它。

我用Engine.IO和Redis以及Pub / Sub结构实现了一个类似的程序,它看起来很优雅。 以下代码将连接的客户端订阅到房间/频道。

io.on('connection', function (socket) { var observerRedisClient = redis.createClient(); observerRedisClient.subscribe(resourceId, redis.print); observerRedisClient.on('message', function(channel, message) { socket.send(message); }); }); 

如果你更新频道,即。 保存一些数据并发布,然后所有订阅的客户端将收到它。

 redisClient.set(key, value, redis.print); redisClient.publish(key, value); 

如果你感兴趣的代码是开源的: https : //github.com/denizozger/node-engine.io-server

那么,正如你自己提到的,我应该看看Primus。 缩放是使用HAProxy实现的。 作为底层通信,你仍然可以使用Socket.io,也可以使用engine.io。 通过使用Primus,您可以尝试不同的库。 在http://pusher.com/docs/server_libraries上有一篇关于缩放Redis的有趣文章。