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。 如果你通过主机/端口,他们将为你创build。 但是,如果你想自己创build它们,出于任何原因(例如,你想调整重新连接超时),你创build这2个客户端,并将其传递给适配器。

  2. 适配器广播全部在内部发射。 所以,它给你的集群function。 例如,假设您有聊天应用程序,并且在负载均衡器后面有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用户将收到发射,但不是剩余的4个用户。 但是,如果使用适配器,则剩余的node.js#2和node.js#3将接收发送完成的信息,并向其客户端发出相同的发射,并且所有6个用户都将收到初始消息。

我一直在努力解决这个问题,但是至less在最初的testing阶段,我发现了一个似乎对我有用的答案。

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

我认为从socket.io文档中缺less的是这样的:

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

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

用这个

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

我一直无法从socket.io中find更多的文档来支持我的理论,但补充说明了这一点。

我分叉这个伟大的聊天的例子,不工作,并得到它在这里工作: https : //github.com/squivo/chat-example-cluster所以最后有一个在线工作的例子:D