处理多个实例上的websocket连接



我需要了解在多个实例上处理websockets的概念,以便它可以跨所有实例共享。例如,我有三个节点正在运行,它们由负载均衡器连接。在接收到需要在特定套接字上发出的数据时。我最初的想法是创建一个hashmap或json对象来保存websocket连接。但我意识到这不能这样做,因为它只会针对它的特定实例。如果我将接收任何实例上的数据,那么大多数数据将不会在该websocket连接上发出,因为它不知道websocket是在哪个实例上创建的。是否有一种好的方法来处理websocket连接,以便它可以在所有实例上共享。我的想法是使用redis或postgres sql数据库,因为它们在所有实例之间是共享的。

我也尝试过postgres解决方案来存储websocket连接,但当我保存连接时,它说

TypeError: conversion circular structure to JSON

是否有一些好的解决方案来处理可以在所有实例之间共享的websocket连接?如果数据库是一个很好的解决方案,我如何解决

TypeError: conversion circular structure to JSON

我猜您正在寻找的是Adapters,并且它在官方套接字中被记录得相对较好。IO文档(/v4/adapter/).

当缩放到多个Socket时。对于IO服务器,您需要用另一个实现替换默认的内存适配器,以便将事件正确路由到所有客户机。

有几个官方适配器可供选择:

<<ul>
  • 复述,适配器/gh><<li> MongoDB适配器/gh><<li> Postgres适配器/gh>集群适配器
  • 下面是一个使用MongoDB适配器的例子:

    npm install @socket.io/mongo-adapter mongodb
    
    const { Server } = require("socket.io");
    const { createAdapter } = require("@socket.io/mongo-adapter");
    const { MongoClient } = require("mongodb");
    // DATABASE CONNECTION
    const DB = "mydb";
    const COLLECTION = "socket.io-adapter-events";
    const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0", {
    useUnifiedTopology: true,
    });
    const io = new Server();
    const main = async () => {
    await mongoClient.connect();
    try {
    await mongoClient.db(DB).createCollection(COLLECTION, {
    capped: true,
    size: 1e6
    });
    } catch (e) {
    // collection already exists
    }
    const mongoCollection = mongoClient.db(DB).collection(COLLECTION);
    // HERE COMES THE IMPORTANT PART :)
    // CREATE MONGO DB ADAPTER AND USE IT 
    io.adapter(createAdapter(mongoCollection));
    io.listen(3000);
    }
    main();
    

    适配器将负责其余的工作。每个发送到多个客户端(例如io.to("room1").emit()socket.broadcast.emit())的数据包将是

    • 发送给连接到当前服务器的所有匹配客户端
    • 插入到MongoDB的capped collection中,并被其他Socket接收。集群的IO服务器

    最新更新