如何将 socket.io 与 node.js worker_threads 一起使用

How to use socket.io with node.js worker_threads

目前我正在 worker_threads 介绍我正在开发的游戏。 Thea 的想法是让每个游戏房间都在一个单独的线程中,这样它们就可以并行处理(是的,我知道只有当线程数不超过核心数时才会真正发生)。

但是,我无法让 socket.ioworker_threads 一起工作。到目前为止,我已经尝试了以下方法:

1.在服务器内创建socket.io服务器:

server.js

const { Worker, isMainThread } = require("worker_threads");

const express = require("express");
const app = express();
app.use(express.static(__dirname));

app.post("/newGame", (request, response) => {
  let roomCode = request.query.room_code;
  const worker = new Worker("./server-worker.js", {
    workerData: {
      roomCode: roomCode
    },
  });
});

app.listen(8080, () => {
  console.info("Server started on http://localhost:8080");
});

服务器-worker.js

const { parentPort, workerData, threadId } = require("worker_threads");


const server = require("http").createServer();
const io = require("socket.io")(server);

server.listen(8080, () => {
  console.info("Server socket.io on port 8080");
});

io.on("connection", (socket) => {
  console.log(`Client with ID ${socket.id} connected to thread with ID ${threadID}`);
});

这导致浏览器记录如下: GET http://localhost:8080/socket.io/?EIO=3&transport=polling&t= 404 (Not Found)

此外,即使我让 Express 将轮询请求转发给工作人员,我猜我也无法打开一个以上的房间,因为端口已经在使用中。

2。在主线程中创建 socket.io 实例并将其传递给

server.js

const { Worker, isMainThread } = require("worker_threads");

const express = require("express");
const app = express();
app.use(express.static(__dirname));

const server = require("http").createServer(app);
const io = require("socket.io")(server);

app.post("/newGame", (request, response) => {
  let roomCode = request.query.room_code;
  const worker = new Worker("./server-worker.js", {
    workerData: {
      roomCode: roomCode,
      io: io
    },
  });
});

但是,这不起作用,因为我得到了 DataCloneError,因为 worker_threads 只能将本机对象发送给工人。

问题:

Node 的工作线程不适合您的目的。它们用于进行长时间 运行 计算,而不是处理网络连接。

此外,将您的房间分配给特定的服务器资源可能没有意义。 Node 擅长并发处理多个应用上下文,socket.io.

也是如此

为了扩展您的应用程序以使用更多处理器内核,node 提供了集群。要使用集群,您需要解决会话粘性问题。