带有 socket.io 命名空间问题的 NodeJS 集群

时间:2021-07-14 17:43:12

标签: node.js sockets socket.io node-cluster

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

1 个答案:

答案 0 :(得分:0)

我在对动态命名空间使用正则表达式时遇到了间歇性问题。也许这就像你的问题。但是这个问题只在使用动态命名空间时发生。 My issue is here 我正在努力想出一种解决方法,但可能没有。

相关问题