Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用Redis存储扩展Engine.IO(与Socket.IO相比)_Node.js_Socket.io - Fatal编程技术网

Node.js 使用Redis存储扩展Engine.IO(与Socket.IO相比)

Node.js 使用Redis存储扩展Engine.IO(与Socket.IO相比),node.js,socket.io,Node.js,Socket.io,关于这个话题有几个问题,但没有一个能完全解决这个问题 我正在redis商店中使用Socket.IO,我正在为交通堵塞做准备。我的托管公司说,“你需要使用Engine.IO而不是Socket.IO,因为这样效率更高”,所以我正忙着弄清楚这意味着什么 答案似乎相互矛盾: 因此,在我看来: Socket.IO 0.9会退化 Engine.IO增强了 Socket.IO 1.0将使用Engine.IO 如果要在多个实例上运行Engine.IO,必须自己编写redis存储 但后来说它是“负载

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

我正在redis商店中使用Socket.IO,我正在为交通堵塞做准备。我的托管公司说,“你需要使用Engine.IO而不是Socket.IO,因为这样效率更高”,所以我正忙着弄清楚这意味着什么

答案似乎相互矛盾:

因此,在我看来:

  • Socket.IO 0.9会退化
  • Engine.IO增强了
  • Socket.IO 1.0将使用Engine.IO
  • 如果要在多个实例上运行Engine.IO,必须自己编写redis存储
但后来说它是“负载平衡器友好的”,但对redis却只字不提。一定有外卖店,对吧?但是如果它有多个传输和一个存储,那么Socket.IO有什么意义呢

然后我看到Socket.IO和to


我如何扩展Engine.IO?我必须自己编写商店吗?

好吧,正如你提到的,我应该看看Primus。使用HAProxy实现缩放。 作为底层通信,您仍然可以使用Socket.io,但也可以使用engine.io。通过使用Primus,您可以尝试使用不同的库。
在上有一篇关于缩放Redis的有趣文章。

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

1)切勿使用Socket.IO(从0.9.16开始)

我的主机告诉我使用Engine.IO(或其他任何东西)是正确的。IO有大量的主要问题,最糟糕的是它会出人意料地出现。我在使用相对较少的客户端时亲身体验到了这一点,它完全禁用了我的服务器,直到我可以重写掉Socket.IO。我升级到25+无人机来吸收冲击,这并不重要。单个客户端每秒可以发送1000个请求

2)其他引擎没有Redis商店

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

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

更新:


Ends up Engine.IO也会进入重新连接循环(每秒几次),所以我最终使用了SockJS。它为我提供了最好的连接性和稳定性,而且(SockJS没有做到)。

我同意,在v1.0发布之前,应该避免使用Socket.IO,因为它有缺陷,而且在我的测试中,Engine.IO表现得更好()。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);

如果您感兴趣,代码是开源的:

请记住,它建议HAProxy使用粘性会话,这意味着它应该始终将具有相同会话的用户重定向到同一台机器。它这样做是为了代替连接信息的公共存储。每种方法都有一些优点和缺点,所以在做出决定之前一定要了解它们。我没有决定。我只是想帮你把这篇文章指向别人写的一些文章。谢谢你降级,我知道。这是为OP设计的。如果您使用Engine.IO,是的,您必须编写自己的存储。我知道抱怨开源项目缺乏更新是不酷的,但我觉得他们好像把球落在了Socket.IO上。有很多问题像这样浮出水面,1.0已经快过半年了。socket.io上有数百个几个月前的未解决问题,因此在这一点上它看起来都是未维护的。如果您想使用engine.io,那么您必须编写额外的内容。我可以想象socket.io在适应新内核时会遇到一些障碍。Socket.io是连接到engine.io的express。它隐藏了engine.io的低级细节,并且灵活且用户友好。但出于同样的原因,我想请你们不要在上面建商店。socket.io 1.0是基于engine.io的承诺构建的。鉴于socket.io 1.0的状态,任何人都可以保证engine.io会成功。如果1.0正在开发中,等待它,因为它会比你能做的更好,如果它来了。嘿,现在你从引擎切换到sockjs,redis pub/sub还能工作吗?您仍然可以使用redis进行扩展?很明显,redis发布/订阅并没有内置在engineio或sockjs中。我完全独立地连接了redis。因为我使用的是Primus,所以切换根本没有改变redis部分。为什么不使用Primus+redis发布/订阅并添加SockJs层?单个socket io客户端每秒可以发送数千个请求,为什么不简单地创建一个时间变量来存储此套接字上次发送请求的时间,如果它是不到一毫秒前,例如,那么这个插座是垃圾邮件和断开它。或者你知道,任何其他类似于阻止垃圾邮件套接字和滥用用户的自定义检查。除非我误解了你的问题。。。