Ins*_*sOp 5 sockets websocket node.js socket.io node-cluster
我有一个节点集群,其中主节点响应 http 请求。服务器还侦听 websocket 连接(通过socket.io)。客户端通过所述 websocket 连接到服务器。现在客户端在各种游戏之间进行选择(每个节点进程处理一个游戏)。
我的问题如下:
是否可以将套接字传递给节点进程,从而无需打开新连接?
您可以将普通 TCP 套接字发送到另一个节点进程,如此处的node.js 文档中所述。基本思想是这样的:
const child = require('child_process').fork('child.js');
child.send('socket', socket);
Run Code Online (Sandbox Code Playgroud)
然后,在 child.js 中,您将拥有以下内容:
process.on('message', (m, socket) => {
if (m === 'socket') {
// you have a socket here
}
});
Run Code Online (Sandbox Code Playgroud)
“socket”消息标识符可以是您选择的任何消息名称 - 它并不特殊。node.js 有一些代码,当您使用child.send()并且您发送的数据被识别为套接字时,它使用特定于平台的进程间通信与其他进程共享该套接字。
但是,我相信这仅适用于除 TCP 状态外尚未建立任何本地状态的普通套接字。我自己没有尝试过使用已建立的 webSocket 连接,但我认为它不起作用,因为一旦 webSocket 具有与其关联的更高级别的状态,而不仅仅是 TCP 套接字(例如加密密钥),就会出现问题,因为操作系统不会自动将该状态转移到新进程。
我应该为每个节点进程打开一个新连接吗?如何告诉客户端他应该连接到确切的节点进程 X?(因为服务器可能会在其打开时处理传入的连接请求)
这可能是获取 socket.io 连接到新进程的最简单方法。如果您确保您的新进程正在侦听唯一的端口号并且它支持 CORS,那么您可以使用您在主进程和客户端之间已有的 socket.io 连接,并在其上向客户端发送一条消息这告诉客户端重新连接到哪里(什么端口号)。然后客户端可以包含代码来侦听该消息并建立到该新目的地的连接。
如果我只使用一个连接(在主进程中)并将用户消息传递给相应的节点进程并将进程消息返回给用户,有什么缺点?(感觉在进程间发送消息的时候,复制比较大的对象会消耗大量CPU)
缺点正如你所猜测的。您的主进程只需要花费 CPU 能量作为双向转发数据包的中间人。这项额外的工作对您是否重要完全取决于上下文,并且必须通过测量来确定。
这是我发现的更多信息。看起来,如果在连接建立其初始 socket.io 状态之前,到达主节点的传入 socket.io 连接立即发送到集群子节点,那么这个概念也适用于 socket.io 连接。
这是一篇关于使用实现代码将连接发送到另一台服务器的文章。这似乎在连接时立即完成,因此它应该适用于发往特定集群的传入 socket.io 连接。这里的想法是对特定集群进程进行粘性分配,并且在建立任何状态之前,所有到达主节点的任何类型的传入连接都会立即转移到集群子节点。
| 归档时间: |
|
| 查看次数: |
3834 次 |
| 最近记录: |