websocketServer.on('connection', function(socket, req) {
socket.on('message', onMessage);
sub.subscribe('chat'); // sub: Redis subscription connection
sub.on('message', onSubMessage);
});
function onMessage(message) {
pub.publish('chat', message); // pub: Redis publishing connection
}
function onSubMessage(channel, message) {
// how to access 'socket' from here?
if (channel === 'chat') socket.send(message);
}
我试图躲过很少的状态和尽可能绑定,以使WS服务器高效和安全;如果我需要扩展,就能够只添加更多的机器 - 状态只会使这更难。我仍然不了解节点内存管理的所有内容。垃圾收集。
在这种情况下,推荐的解决方案是什么?将onSubMessage
移至connection
回调以访问socket
?但是函数会在每个连接上初始化吗?
我还有其他选择吗?
用户打开与服务器的WebSocket连接。如果用户发送消息,它将被发送到Redis频道(也可能将其称为Pub / Sub主题),该频道将其广播到每个订阅的客户端(onSubMessage
)。 Redis Pub / Sub充当集中式广播公司:我不必担心不同的服务器或状态,Redis会向所有感兴趣的人发送消息。无忧无虑的扩展。
答案 0 :(得分:2)
您可以使用bind()
预先定义回调函数的额外参数:
...
sub.on('message', onSubMessage.bind(sub, socket));
...
function onSubMessage(socket, channel, message) {
if (channel === 'chat') socket.send(message);
}
这个 为每个新连接创建一个新的函数实例,因此在内存使用方面使用包装函数可能没有真正的好处。