我已经像 documentation 建议的那样使用 socket.io 设置了一个 NodeJS 集群。 在其中一名工人上,我有一个发射器,它应该在循环中向所有客户端发射。一切正常,直到我开始使用命名空间。当发送到命名空间时,客户端(连接到命名空间)有时会收到事件,有时不会。似乎适配器没有在所有工作人员之间共享命名空间发出,并且客户端只有在连接到实际发出的工作人员时才会收到事件。任何人都可以建议如何制作所有客户端都将接收的命名空间发射?
const cluster = require("cluster");
const { Server } = require("socket.io");
const numCPUs = require("os").cpus().length;
const redisAdapter = require("socket.io-redis");
const { setupMaster, setupWorker } = require("@socket.io/sticky");
const app = require('express')();
const ioOptions = {
cors: {
origin: "http://localhost:8080",
methods: ["GET", "POST"],
withCredentials: true
}
};
if (cluster.isMaster) {
const httpServer = require('http').createServer({}, app);
setupMaster(httpServer, {
loadBalancingMethod: "round-robin",
});
httpServer.listen(8443);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on("exit", (worker) => {
console.log(`Worker ${worker.process.pid} died`);
cluster.fork();
});
}
else if (cluster.isWorker) {
const httpServer = require('http').createServer({}, app);
const io = new Server(httpServer, ioOptions);
io.adapter(redisAdapter({ host: "localhost", port: 6379 }));
setupWorker(io);
if (cluster.worker.id === 1) {
setInterval(() => {
io.emit('event', data); // works
io.of('/').emit('event', data); // works
io.of('somenamespace').emit('event', data); // works in half of the cases
}, 100);
}
io.on("connection", (socket) => {
/* ... */
});
}
答案 0 :(得分:0)
我在对动态命名空间使用正则表达式时遇到了间歇性问题。也许这就像你的问题。但是这个问题只在使用动态命名空间时发生。 My issue is here 我正在努力想出一种解决方法,但可能没有。