使用PM2

时间:2018-02-27 15:35:42

标签: node.js websocket pm2

我当前的设置是使用PM2运行多个节点实例来管理实例并充当负载均衡器。

我想使用websockets实现一些功能。 想到的第一个问题是在X节点实例之间共享套接字。

我的理解是,如果我在节点env中启动websocket-server,只有env可以访问连接到它的套接字。 我不想为每个用户为每个实例加载Web套接字,因为这似乎浪费了资源。

目前我正在玩npm的websocket包,但如果有更好的选择,我与此无关。

我希望套接字或多或少地将数据从服务器单向推送到客户端,并避免从客户端到服务器的任何内容。

到目前为止,我的解决方案是启动另一个仅充当websocket服务器的节点实例。

这将允许用户像往常一样对所有请求进行正常操作,但是对专用于套接字的单独节点实例进行websocket连接。

然后,只要更新某些内容,服务器就可以将消息发送到专用套接字服务器,以便将数据发送回适当的客户端。

我不确定这是最好的选择,我正在尝试查看是否有其他推荐的方法来管理跨多个节点实例的websockets,但仍允许我根据需要启动/关闭节点实例。

1 个答案:

答案 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