跳至主要内容
版本:4.x

使用 PM2

PM2 是一个用于 Node.js 应用程序的生产流程管理器,具有内置的负载均衡器。它允许您让应用程序永远保持运行,在不停止服务的情况下重新加载它们,并简化常见的系统管理员任务。

您可以在此处找到其文档:https://pm2.node.org.cn/docs/usage/pm2-doc-single-page/

要使用 PM2 扩展 Socket.IO 服务器,有三种解决方案

  • 在客户端禁用 HTTP 长轮询
const socket = io({
transports: ["websocket"]
});

但是,在这种情况下,如果无法建立 WebSocket 连接,将不会回退到 HTTP 长轮询。

  • 为每个工作进程使用不同的端口,并在它们前面使用像 nginx 这样的负载均衡器

  • 使用 @socket.io/pm2

安装

npm install -g @socket.io/pm2

如果 pm2 已经安装,您需要先将其删除

npm remove -g pm2

@socket.io/pm2 可以用作 pm2 的直接替换,并支持 pm2 实用程序类的所有命令。

唯一的区别来自 此提交

用法

worker.js

const { createServer } = require("http");
const { Server } = require("socket.io");
const { createAdapter } = require("@socket.io/cluster-adapter");
const { setupWorker } = require("@socket.io/sticky");

const httpServer = createServer();
const io = new Server(httpServer);

io.adapter(createAdapter());

setupWorker(io);

io.on("connection", (socket) => {
console.log(`connect ${socket.id}`);
});

ecosystem.config.js

module.exports = {
apps : [{
script : "worker.js",
instances : "max",
exec_mode : "cluster"
}]
}

然后运行 pm2 start ecosystem.config.js(或 pm2 start worker.js -i 0)。就是这样!您现在可以在端口 8080 上访问 Socket.IO 集群。

工作原理

扩展到多个节点 时,需要做两件事

  • 启用粘性会话,以便 Socket.IO 会话的 HTTP 请求被路由到同一个工作进程
  • 使用自定义适配器,以便数据包被广播到所有客户端,即使它们连接到另一个工作进程

为了实现这一点,@socket.io/pm2 包含两个额外的包

pm2 的唯一区别来自 此提交

  • God 进程现在创建自己的 HTTP 服务器并将 HTTP 请求路由到正确的工作进程
  • God 进程还中继工作进程之间的数据包,以便 io.emit() 正确地到达所有客户端

请注意,如果您有几个主机,每个主机都运行一个 PM2 集群,您将不得不使用另一个适配器,例如 Redis 适配器

该分支的源代码可以在这里找到 这里。我们将尝试紧密跟踪 pm2 包的发布。