io.adapter是如何在引擎盖下工作的



我正在开发由node.js+express+socket.io提供支持的1-1聊天室应用程序。我正在关注文章:Socket.IO-房间和命名空间

在文章中,他们演示了如何使用模块socket.io-redis:启动io.adapter

var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

两个问题:

  1. 在文档中,他们又提到了两个参数:pubClientsubClient。我应该供应吗?有什么区别
  2. io.adapter的行为如何?例如,如果用户A连接到服务器A,而用户B是服务器B,并且他们想要彼此"交谈"。引擎盖下面发生了什么

谢谢。

  1. 您不需要传递自己的pubClient/subClient。如果您通过主机/端口,它们将为您创建。但是,如果您想自己创建它们,无论出于何种原因(例如,您想调整重新连接超时),都可以创建这两个客户端并将其传递给适配器。

  2. 适配器在内部广播所有发射。因此,它为您提供了集群功能。例如,假设您有聊天应用程序,并且负载均衡器后面有3个node.js服务器(因此它们共享一个URL)。我们还假设6个不同的浏览器连接到负载均衡器URL,并且它们被路由到3个独立的node.js进程,每个node.js服务器2个用户。如果客户端#1发送消息,node.js#1将执行类似io.to('chatroom').emit('msg from user #1')的操作。如果没有适配器,两个服务器#1用户都将接收到emit,但其余4个用户不会接收到。然而,如果您使用适配器,剩下的node.js#2和node.js#3将接收到发射完成的信息,并将向其客户端发出相同的发射,所有6个用户都将收到初始消息。

我一直在为同样的问题而挣扎,但我找到了一个似乎对我有效的答案,至少在我最初的测试阶段是这样。

我有一个集群应用程序运行8个实例,使用express、cluster、socket.io、socket.io-redis和NOT stick sessions->,因为使用stick似乎会导致大量奇怪的错误。

我认为socket.io文档中缺少的是:

io.adapter(redis({ host: 'localhost', port: 6379 }));只支持web套接字(至少它不支持长轮询),因此客户端需要指定web套接字是唯一可用的传输。我一做到这一点,就能够让它继续下去。因此,在客户端端,我向套接字构造函数添加了{transports:['websockets']}。。。所以与其这样。。。

var socketio = io.connect( window.location.origin );

使用这个

var socketio = io.connect( window.location.origin , {transports:['websocket']} );

我还没能从socket.io中找到更多的文档来支持我的理论,但添加这些文档让它开始了。

我提出了一个不起作用的聊天示例,并在这里发挥了作用:https://github.com/squivo/chat-example-cluster所以最后有一个在线的工作示例:D

相关内容

  • 没有找到相关文章

最新更新