与 PM2 一起使用

PM2 是具有内置负载均衡器的 Node.js 应用程序的生产流程管理器。它允许您使应用程序永远保持活动状态,在不停机的情况下重新加载它们,并促进常见的系统管理任务。

你可以在这里找到它的文档:https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/

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

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

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

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

  • 利用 @socket.io/pm2

安装

  1. npm install -g @socket.io/pm2

如果pm2已安装,则必须先将其删除:

  1. npm remove -g pm2

@socket.io/pm2可以用作pm2的替代品,并支持pm2的所有命令。

唯一的区别来自这个commit

用法

worker.js

  1. const { createServer } = require("http");
  2. const { Server } = require("socket.io");
  3. const { createAdapter } = require("@socket.io/cluster-adapter");
  4. const { setupWorker } = require("@socket.io/sticky");
  5. const httpServer = createServer();
  6. const io = new Server(httpServer);
  7. io.adapter(createAdapter());
  8. setupWorker(io);
  9. io.on("connection", (socket) => {
  10. console.log(`connect ${socket.id}`);
  11. });

ecosystem.config.js

  1. module.exports = {
  2. apps : [{
  3. script : "worker.js",
  4. instances : "max",
  5. exec_mode : "cluster"
  6. }]
  7. }

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

这个怎么运作

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

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

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

pm2唯一的区别来自这个 commit

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

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

可以在此处找到 fork 的源代码。我们将尝试密切关注pm2软件包的发布。