当2台服务器连接到同一套接字redis适配器时。他们俩同时从客户端获取消息吗?

时间:2016-08-08 02:53:44

标签: socket.io

我有两台服务器server-bsocket.io

通常使用server-a,两台服务器都使用redis适配器。然后,客户端可以连接到server-bserver-a

现在的问题是:如果客户端连接到server-b并发出消息。 io.emit('sendMessage',myMessage) 是否有选项可以获取消息?

客户端代码:

io.on('sendMessage',function(){
     console.log('Server A got the message')
}

服务器 - 代码:

io.on('sendMessage',function(){
     console.log('Server B got the message')
}

服务器 - 代码:

client

server-a仅与server-a相关联。 server-b& server-b正在使用相同的redis适配器。

问题是:当客户端发出消息时,Server-B会得到它吗? (socket.io仅连接到相同的redis)

我想做什么:我有几个服务器应该根据客户端请求执行操作。当客户端请求某些内容时,所有服务器都需要启动。我想与socket.io一起做,并在客户端和服务器之间保持一个连接。

所有服务器都将使用 af;laskjdf;lkasjda123241234123 $sakdfja;lskfj12352135qadsfasfa falskdfjqwr1351 ##alskgja;lksjgklajs23523, asdfa#####1217653asl123654fjaksj asdkjf23s#q23asjfklj asko3 从客户端获取相同的消息。

1 个答案:

答案 0 :(得分:1)

如果您正在将redis适配器与所有服务器一起使用,那么当您执行以下操作时:

io.emit('sendMessage',myMessage)

从您的任何一台服务器,然后该消息将最终发送到连接到所有服务器的所有客户端。内部发生的是将消息发送到所有服务器正在侦听的redis通道。当每个服务器收到消息后,它们会向所有用户广播,但这些最后一步是由redis适配器和redis存储为您透明处理的。

因此,io.emit()用于发送到所有连接的客户端(它使用所有服务器来执行广播)。它不用于直接向所有服务器广播相同的消息,以便他们可以手动处理该消息。

要发送到每个服务器,您可能使用自己的自定义redis发布/订阅频道消息,因为每个服务器已经连接到redis,这是redis擅长的。

或者,您可以指定一个主socket.io服务器,并让所有其他服务器使用socket.io连接到它。然后,任何服务器都可以要求中央服务器向所有其他服务器广播消息。