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

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

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

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

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

使用:

socket.io@4.1.0

粘性@1.0.1

群集适配器@0.1.0

我正在跟踪这份文件:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
    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
代码运行次数:0
运行
AI代码解释
复制
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 05:41:56

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

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

https://stackoverflow.com/questions/70318844

复制
相关文章

相似问题

在带有Kubernetes的OrientDB集群中没有发现节点

10

kubernetes go客户端使用节点和集群的存储

12

污染kubernetes活动集群中的节点

21

安全关闭kubernetes集群中的节点

15

在kubernetes集群的所有节点上运行守护程序

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文