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

时间:2014-09-24 10:41:48

标签: node.js express websocket socket.io cluster-computing

我正在研究由node.js + express + socket.io提供支持的1-1聊天室应用程序。 我正在关注这篇文章:Socket.IO - Rooms and Namespaces

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

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,并且他们想要彼此“交谈”。发生了什么事?
  3. 感谢。

2 个答案:

答案 0 :(得分:1)

  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个用户都将收到初始消息。

答案 1 :(得分:0)

我一直在努力解决同样的问题,但我找到了一个似乎对我有用的答案,至少在我的初始测试阶段是这样。

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

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

io.adapter(redis({ host: 'localhost', port: 6379 }));仅支持Web套接字(至少它不支持长轮询),因此客户端需要指定websockets是唯一可用的传输。我一做到这一点就能让它继续下去。所以在客户端方面,我将{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