我当前的设置是使用PM2运行多个节点实例来管理实例并充当负载均衡器。
我想使用websockets实现一些功能。 想到的第一个问题是在X节点实例之间共享套接字。
我的理解是,如果我在节点env中启动websocket-server,只有env可以访问连接到它的套接字。 我不想为每个用户为每个实例加载Web套接字,因为这似乎浪费了资源。
目前我正在玩npm的websocket
包,但如果有更好的选择,我与此无关。
我希望套接字或多或少地将数据从服务器单向推送到客户端,并避免从客户端到服务器的任何内容。
到目前为止,我的解决方案是启动另一个仅充当websocket服务器的节点实例。
这将允许用户像往常一样对所有请求进行正常操作,但是对专用于套接字的单独节点实例进行websocket连接。
然后,只要更新某些内容,服务器就可以将消息发送到专用套接字服务器,以便将数据发送回适当的客户端。
我不确定这是最好的选择,我正在尝试查看是否有其他推荐的方法来管理跨多个节点实例的websockets,但仍允许我根据需要启动/关闭节点实例。
答案 0 :(得分:1)
我建议你避免复杂的设置,只需让socket.io在多个节点上工作,从而分配负载;如果您想避免从客户端到服务器的数据,请不要监听服务器上的传入事件。
Socket.io在以下条件下支持多个节点:
您已启用sticky sessions。这可以确保请求连接回源自它们的进程。
您使用名为socket.io-redis的特殊适配器&一个小的Redis实例作为存储的中心点 - 它在您的节点集群中跟踪名称空间/房间和连接的套接字。
以下是一个例子:
// setup io as usual
const io = require('socket.io')(3000)
// Set a redisAdapter as an adapter.
const redisAdapter = require('socket.io-redis')
io.adapter(redisAdapter({ host: 'localhost', port: 6379 }))
从那时起,它就像往常一样:
io.emit('hello', 'to all clients')
您可以在此处阅读更多内容:Socket.IO - Using Multiple Nodes。