1

目前我正在介绍worker_threads我正在开发的游戏。Thea 的想法是将每个游戏室放在一个单独的线程中,以便可以并行处理它们(是的,我知道只有在线程数不超过内核数的情况下才会真正发生这种情况)。

但是,我无法socket.io使用worker_threads. 到目前为止,我已经尝试了以下方法:

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

服务器.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");
});

server-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实例并传递它

服务器.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 只能将本机对象发送给工作人员。

问题:

  • 有没有更简单的方法来完成我正在做的事情?即:我只是使用了错误的框架吗?
  • 有没有办法socket.io使用线程?我已经看到了有关使用 Redis 实例将它与 node.js 集群一起使用的文档,但这对于手头的问题来说似乎有点过分了,因为我没有多个进程/节点。
4

1 回答 1

1

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

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

为了扩展您的应用程序以使用更多处理器内核,节点提供了集群。要使用集群,您需要整理会话粘性。

于 2021-08-07T12:25:11.950 回答