NodeJS集群与socket.io命名空间问题



我已经用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) => {
/* ... */
});
} 

在为动态命名空间使用正则表达式时,我遇到了一个间歇性问题。也许这就像你的问题。但只有在使用动态名称空间时才会出现此问题。我的问题在这里我正在努力想出一个变通办法,但可能没有。

最新更新