13

关于这个主题有几个问题,但没有一个能完全解决这个问题。

我正在使用带有 redis 存储的 Socket.IO,并且我正在为流量增加做准备。我的托管公司说,“你需要使用 Engine.IO 而不是 Socket.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?我必须自己写商店吗?

4

3 回答 3

10

只是想分享我在上周学到的东西,但希望其他人能来并明确回答这个问题,这样我就可以给他们检查一下。

1) 永远不要使用 Socket.IO (截至 0.9.16)

我的主人告诉我使用 Engine.IO(或其他任何东西)是正确的。Socket.IO 有大量的重大问题,其中最糟糕的是它会意外地对您的服务器进行 DDoS 攻击。我在客户端相对较少的情况下亲身体验了这一点,它完全禁用了我的服务器,直到我可以重写 Socket.IO。我扩大到 25 多架无人机来吸收打击,这没关系。单个客户端每秒可以发送 1000 个请求。

2) 其他引擎没有 Redis 存储

Socket.IO 允许您通过放入其 Redis 存储来跨节点广播。据我所知,Engine.IO、Primus 和 SockJS 不提供此功能。因此,当这些引擎声称“负载均衡器”友好时,并不意味着您可以跨节点广播。我开始认为这实际上是一件好事。使用 redis 编写 pub/sub 相对容易,并且将其分离出来也很不错。

我最终将PrimusEngine.IO一起使用,然后使用redis pub/sub 在节点之间共享事件。我花了大约 5 个小时来删除 Socket.IO、连接 Primus、编写 pub/sub 并上线。到目前为止,这是一次更好的体验。

更新:

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

于 2013-08-18T23:07:15.783 回答
1

我同意在 v1.0 发布之前应该避免使用 Socket.IO,它有问题并且在我的测试中 Engine.IO 表现更好(https://medium.com/node-js-javascript/b63bfca0539)。Primus 也绝对是一个不错的选择:也许您现在会使用 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

于 2014-01-28T17:40:27.397 回答
-1

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

于 2013-08-12T10:09:05.103 回答