Necesito entender el concepto de manejar websockets en múltiples instancias para que pueda compartirse entre todas las instancias. Por ejemplo, tengo tres nodos en ejecución que están siendo conectados por el balanceador de carga. Al recibir los datos que deben emitirse en el socket específico. Mi idea inicial era crear un hashmap u objetos json para mantener las conexiones websocket. Pero me doy cuenta de que esto no se puede hacer de esta manera, ya que solo será específico para su instancia particular. Si recibo los datos en cualquiera de las instancias, la mayoría de los datos no se emitirán en esa conexión websocket, ya que no sabe en qué instancia se crea el websocket. ¿Existe una buena manera de manejar las conexiones websocket para que pueda compartirse en todas las instancias? Mi idea era usar la base de datos redis o postgres sql porque se comparten entre todas las instancias.
También probé la solución postgres para almacenar la conexión websocket pero cuando guardo la conexión dice
TypeError: Conversión de estructura circular a JSON
¿Existe alguna buena solución para manejar las conexiones websocket que podrían compartirse entre todas las instancias? Si la base de datos es una buena solución, ¿cómo puedo resolver
TypeError: Conversión de estructura circular a JSON
Supongo que lo que está buscando son Adapters , y está relativamente bien documentado en la documentación oficial de socket.io ( /v4/adapter/ ).
Al escalar a varios servidores Socket.IO, deberá reemplazar el adaptador en memoria predeterminado por otra implementación, de modo que los eventos se enruten correctamente a todos los clientes.
Tienes varios adaptadores oficiales entre los que puedes elegir:
Aquí hay un ejemplo usando el Adaptador 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(); El adaptador se encargará del resto. Cada paquete que se envía a varios clientes (p. ej io.to("room1").emit() o socket.broadcast.emit() ) será