如何将 socket.io 与 node.js worker_threads 一起使用
How to use socket.io with node.js worker_threads
目前我正在 worker_threads
介绍我正在开发的游戏。 Thea 的想法是让每个游戏房间都在一个单独的线程中,这样它们就可以并行处理(是的,我知道只有当线程数不超过核心数时才会真正发生)。
但是,我无法让 socket.io
与 worker_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 只能将本机对象发送给工人。
问题:
- 有没有更简单的方法来完成我正在做的事情?即:我只是使用了错误的框架吗?
- 有没有办法让
socket.io
使用线程?我已经看到了关于使用 Redis 实例将它与 node.js 集群一起使用的文档,但这对于手头的问题来说似乎有点过分了,因为我没有多个进程/节点。
Node 的工作线程不适合您的目的。它们用于进行长时间 运行 计算,而不是处理网络连接。
此外,将您的房间分配给特定的服务器资源可能没有意义。 Node 擅长并发处理多个应用上下文,socket.io.
也是如此
为了扩展您的应用程序以使用更多处理器内核,node 提供了集群。要使用集群,您需要解决会话粘性问题。
目前我正在 worker_threads
介绍我正在开发的游戏。 Thea 的想法是让每个游戏房间都在一个单独的线程中,这样它们就可以并行处理(是的,我知道只有当线程数不超过核心数时才会真正发生)。
但是,我无法让 socket.io
与 worker_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 只能将本机对象发送给工人。
问题:
- 有没有更简单的方法来完成我正在做的事情?即:我只是使用了错误的框架吗?
- 有没有办法让
socket.io
使用线程?我已经看到了关于使用 Redis 实例将它与 node.js 集群一起使用的文档,但这对于手头的问题来说似乎有点过分了,因为我没有多个进程/节点。
Node 的工作线程不适合您的目的。它们用于进行长时间 运行 计算,而不是处理网络连接。
此外,将您的房间分配给特定的服务器资源可能没有意义。 Node 擅长并发处理多个应用上下文,socket.io.
也是如此为了扩展您的应用程序以使用更多处理器内核,node 提供了集群。要使用集群,您需要解决会话粘性问题。