首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kubernetes中的Socket.IO集群,多个节点没有发送到所有客户端

Kubernetes中的Socket.IO集群,多个节点没有发送到所有客户端
EN

Stack Overflow用户
提问于 2021-12-11 20:37:30
回答 1查看 227关注 0票数 0

我有一个kubernetes环境,我正在尝试向它发布我的socket.io nodejs应用程序,以便进行缩放。

它只向连接到同一台服务器的客户端发送消息,其他客户端根本没有收到任何消息。

使用:

socket.io@4.1.0

粘性@1.0.1

群集适配器@0.1.0

我正在跟踪这份文件:

下面是我的集群-socket.js:

代码语言:javascript
运行
复制
const cluster = require("cluster");
const http = require("http");
const { Server } = require("socket.io");
const numCPUs = require("os").cpus().length;
const { setupMaster, setupWorker } = require("@socket.io/sticky");
const { createAdapter, setupPrimary } = require("@socket.io/cluster-adapter");

if (cluster.isMaster) {
    console.log(`Master ${process.pid} is running`);

    const httpServer = http.createServer();

    setupMaster(httpServer, {
        loadBalancingMethod: "least-connection",
    });

    setupPrimary();

    cluster.setupMaster({
        serialization: "advanced",
    });

    httpServer.listen(80);

    console.log(`Starting ${numCPUs} workers...`);

    for (let i = 0; i < numCPUs; i++) {
        var worker = cluster.fork();
        console.log(`Worker ${worker.process.pid} started.`);
    }

    console.log(`Started ${numCPUs} workers.`);

    cluster.on("exit", (worker) => {
        console.log(`Worker ${worker.process.pid} died`);
        cluster.fork();
    });
} else {
    console.log(`Worker ${process.pid} started`);

    const httpServer = http.createServer();
    const io = new Server(httpServer, {
        transports: ["websocket"],
        cors: {
            origin: "*",
            methods: ["GET", "POST"]
        }
    });

    io.adapter(createAdapter());
    setupWorker(io);

    io.on('connection', (socket) => {
        socket.emit("MESSAGE", "Welcome to Stream Socket.");

        socket.on('disconnect', () => { });

        socket.on('SUBSCRIBE', (msg) => {
            try {
                console.log(msg);
                
                var obj = JSON.parse(msg);
                socket.join(obj.requestedStream);

                if (obj.requestedStream.startsWith("OLD_MESSAGES")) {
                    // This here is only emitting to clients connected to same server.
                    io.to("OLD_MESSAGES").emit("___OLD MESSAGES HERE____");
                }

            } catch (e) { console.log(e); }
        });

        socket.on('UNSUBSCRIBE', (msg) => {
            var obj = JSON.parse(msg);
            socket.leave(obj.requestedStream);
        });
    });
}

我在kubernetes上启用了nginx,入口:

代码语言:javascript
运行
复制
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/affinity-mode: "persistent"
nginx.ingress.kubernetes.io/affinity-canary-behavior: "sticky"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"
nginx.ingress.kubernetes.io/session-cookie-expires: "10800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "10800"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600" 
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
nginx.ingress.kubernetes.io/send-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-ssl-server-name: "on"

下面是我如何连接到套接字:

代码语言:javascript
运行
复制
    var server = document.getElementById('address').value;

    socket = io(server, {
        transports: ["websocket"],
        'reconnection': false,
        
    });

    socket.on('MESSAGE', (msg) => {
        logResponse(msg);
    });

    socket.on('MESSAGE', (msg) => {
        logResponse(msg);
    });

最后我的博士文件:

代码语言:javascript
运行
复制
FROM node:14
EXPOSE 80
EXPOSE 443

WORKDIR /usr/src/app
COPY package*.json ./
RUN apt-get update && \
    apt-get install -y software-properties-common && \
    rm -rf /var/lib/apt/lists/*
RUN sed -i "/^# deb.*multiverse/ s/^# //" /etc/apt/sources.list
RUN sed -i "/^# deb.*universe/ s/^# //" /etc/apt/sources.list
RUN npm install
RUN npm ci --only=production
COPY . .
CMD ["node", "clustered-socket.js"]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-12 13:41:56

使用一个适配器,该适配器使用连接到Redis、Mongodb或Postgres适配器等所有节点的数据库。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70318844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档