使用PM2在多实例节点环境中设置websockets
Setting up websockets in a multi-instance node environment using PM2
我当前的设置是 运行 多个节点实例,使用 PM2 来管理实例并充当负载平衡器。
我想使用 websockets 实现一些功能。
第一个想到的问题是在 X 节点实例之间共享套接字。
我的理解是,如果我在节点 env 中启动一个 websocket-server,则只有该 env 才能访问连接到它的套接字。
我不想为每个用户的每个实例加载网络套接字,因为这似乎是一种资源浪费。
目前我正在使用 npm 上的 websocket
包,但如果有更好的选择,我绝不会受此约束。
我希望套接字或多或少将数据从服务器单向推送到客户端,并避免从客户端到服务器的任何数据。
到目前为止,我的解决方案是启动另一个仅充当 websocket 服务器的节点实例。
这将允许用户像通常实例一样发出所有请求,但与专用于套接字的单独节点实例建立 websocket 连接。
服务端可以在更新任何内容时向专用套接字服务器发送消息,以将数据发送回适当的客户端。
我不确定这是最好的选择,我正在尝试查看是否有其他推荐的方法来管理跨多个节点实例的 websockets,但仍然允许我根据需要旋转 up/down 节点实例。
我建议您避免复杂的设置,让 socket.io 跨多个节点工作,从而分配负载;如果你想避免数据从客户端传到服务器,就不要监听服务器上的传入事件。
Socket.io支持多节点,条件如下:
您已启用 sticky sessions。这可确保请求连接回它们的来源进程。
您使用一个名为 socket.io-redis & a small Redis 实例的特殊适配器作为存储的中心点 - 它跟踪 namespaces/rooms 和 跨节点集群的连接套接字。
这是一个例子:
// 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。
我当前的设置是 运行 多个节点实例,使用 PM2 来管理实例并充当负载平衡器。
我想使用 websockets 实现一些功能。 第一个想到的问题是在 X 节点实例之间共享套接字。
我的理解是,如果我在节点 env 中启动一个 websocket-server,则只有该 env 才能访问连接到它的套接字。 我不想为每个用户的每个实例加载网络套接字,因为这似乎是一种资源浪费。
目前我正在使用 npm 上的 websocket
包,但如果有更好的选择,我绝不会受此约束。
我希望套接字或多或少将数据从服务器单向推送到客户端,并避免从客户端到服务器的任何数据。
到目前为止,我的解决方案是启动另一个仅充当 websocket 服务器的节点实例。
这将允许用户像通常实例一样发出所有请求,但与专用于套接字的单独节点实例建立 websocket 连接。
服务端可以在更新任何内容时向专用套接字服务器发送消息,以将数据发送回适当的客户端。
我不确定这是最好的选择,我正在尝试查看是否有其他推荐的方法来管理跨多个节点实例的 websockets,但仍然允许我根据需要旋转 up/down 节点实例。
我建议您避免复杂的设置,让 socket.io 跨多个节点工作,从而分配负载;如果你想避免数据从客户端传到服务器,就不要监听服务器上的传入事件。
Socket.io支持多节点,条件如下:
您已启用 sticky sessions。这可确保请求连接回它们的来源进程。
您使用一个名为 socket.io-redis & a small Redis 实例的特殊适配器作为存储的中心点 - 它跟踪 namespaces/rooms 和 跨节点集群的连接套接字。
这是一个例子:
// 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。