我正在研究由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 }));
pubClient
和subClient
。我应该提供吗?有什么区别?感谢。
答案 0 :(得分:1)
您无需传递自己的pubClient / subClient。如果您传递主机/端口,将为您创建它们。但是,如果您想以任何理由(例如,您想要调整重新连接超时)自己创建它们,则创建这两个客户端并将其传递给适配器。
适配器在内部广播所有发射。因此,它为您提供了群集功能。例如。假设您有聊天应用程序,并且您在负载均衡器后面有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