簡體   English   中英

處理多個實例上的 websocket 連接

[英]handle websocket connections on multiple instances

我需要了解在多個實例上處理 websockets 的概念,以便它可以在所有實例之間共享。 例如,我有三個節點正在運行,這些節點由負載平衡器連接。 在接收需要在特定套接字上發出的數據時。 我最初的想法是創建一個 hashmap 或 json 對象來保存 websocket 連接。 但我意識到這不能以這種方式完成,因為它只會特定於其特定實例。 如果我將在任何實例上接收數據,那么大部分數據將不會在該 websocket 連接上發出,因為它不知道 websocket 是在哪個實例上創建的。 是否有一種處理 websocket 連接的好方法,以便它可以在所有實例上共享。 我的想法是使用 redis 或 postgres sql 數據庫,因為它們在所有實例之間共享。

我也嘗試過使用 postgres 解決方案來存儲 websocket 連接,但是當我保存連接時,它說

類型錯誤:將圓形結構轉換為 JSON

是否有一些好的解決方案來處理可以在所有實例之間共享的 websocket 連接。 如果數據庫是一個很好的解決方案,我該如何解決

類型錯誤:將圓形結構轉換為 JSON

我猜你正在尋找的東西是Adapters ,它在官方 socket.io 文檔( /v4/adapter/ )中有相對較好的記錄。

當擴展到多個 Socket.IO 服務器時,您需要用另一個實現替換默認的內存中適配器,以便將事件正確路由到所有客戶端。

您有多種官方適配器可供選擇:

  • Redis 適配器
  • MongoDB 適配器
  • Postgres 適配器
  • 集群適配器

以下是使用MongoDB Adapter 的示例:

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 上限集合中,並由集群的其他 Socket.IO 服務器接收

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM