我需要了解在多个实例上处理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>下面是一个使用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服务器