[英]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 服務器時,您需要用另一個實現替換默認的內存中適配器,以便將事件正確路由到所有客戶端。
您有多種官方適配器可供選擇:
以下是使用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()
)將是
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.