如何使用套接字.IO与node.js worker_threads



目前我正在开发的一款游戏中引入worker_threads。我们的想法是让每个游戏室在一个单独的线程中,这样它们就可以并行处理(是的,我知道这只会发生,如果没有更多的线程比核心)。

然而,我不能让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");
});

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实例并将其传递给

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只能发送本地对象给worker。

问题:

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

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

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

要扩展应用程序以使用更多的处理器内核,node提供集群。要使用集群,您需要对会话粘性进行排序。