如何在插槽IO中使用PM2集群?

时间:2018-03-05 17:33:39

标签: node.js socket.io pm2

我正在开发一个完全依赖于Socket.io的应用程序。众所周知,NodeJS默认只在一个核心上运行。现在我想在多个核心上扩展它。我发现难以使用PM2群集模式进行socketio工作。任何示例代码都会有所帮助。

我正在使用炮兵进行测试。当应用程序在单核上运行时,我得到响应,而它在集群中运行,响应将是NaN

When Ran in a Cluster

When Ran Without Cluster

3 个答案:

答案 0 :(得分:0)

PM2文档说

  

确保您的应用程序是无状态的,这意味着没有本地数据   存储在进程中,例如会话/ websocket连接,   会话记忆和相关的。使用Redis,Mongo或其他数据库   在进程之间共享状态。

Socket.io不是无国籍的。

Kubernetes实现通过基于源IP路由到特定实例来解决状态问题。这仍然不是100%,因为某些来源可能会出现多个IP地址。我知道这不是PM2,但可以让您了解复杂性。

答案 1 :(得分:0)

尝试使用此库:

https://github.com/luoyjx/socket.io-redis-stateless

它使套接字io通过redis变为无状态。

答案 2 :(得分:0)

您需要使用节点服务器设置Redis。这是我设法使群集模式与Socket.io一起使用的方式

首先安装Redis。如果您使用的是Ubuntu,请点击以下链接:https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

然后:

npm i socket.io-redis

现在将Redis放置在您的节点服务器中

const redisAdapter = require('socket.io-redis')

global.io = require('socket.io')(server, { transports: [ 'websocket' ]})

io.adapter(redisAdapter({ host: 'localhost', port: 6379 }))

这就是我要使PM2集群模式与服务器中的socket.io一起使用所要做的一切。