跳至主要内容
版本:4.x

MongoDB 适配器

工作原理

MongoDB 适配器依赖于 MongoDB 的 变更流(因此需要副本集或分片集群)。

发送到多个客户端的每个数据包(例如 io.to("room1").emit()socket.broadcast.emit())将

  • 发送到连接到当前服务器的所有匹配客户端
  • 插入到 MongoDB 有上限的集合中,并由集群中的其他 Socket.IO 服务器接收
Diagram of how the MongoDB adapter worksDiagram of how the MongoDB adapter works

此适配器的源代码可以在这里找到 这里.

支持的功能

功能socket.io 版本支持
套接字管理4.0.0✅ 是(从版本 0.1.0 开始)
服务器间通信4.1.0✅ 是(从版本 0.1.0 开始)
带有确认的广播4.5.0✅ 是(从版本 0.2.0 开始)
连接状态恢复4.6.0✅ 是(从版本 0.3.0 开始)

安装

npm install @socket.io/mongo-adapter mongodb

对于 TypeScript 用户,您可能还需要 @types/mongodb

用法

在 Socket.IO 集群中广播数据包是通过创建 MongoDB 文档并在每个 Socket.IO 服务器上使用 变更流 来实现的。

有两种方法可以清理 MongoDB 中的文档

使用有上限的集合的用法

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/mongo-adapter";
import { MongoClient } from "mongodb";

const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";

const io = new Server();

const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0");

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);

io.adapter(createAdapter(mongoCollection));
io.listen(3000);

使用 TTL 索引的用法

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/mongo-adapter";
import { MongoClient } from "mongodb";

const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";

const io = new Server();

const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0");

await mongoClient.connect();

const mongoCollection = mongoClient.db(DB).collection(COLLECTION);

await mongoCollection.createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 3600, background: true }
);

io.adapter(createAdapter(mongoCollection, {
addCreatedAtField: true
}));

io.listen(3000);

选项

名称描述默认值添加于
uid此节点的 ID随机 IDv0.1.0
requestsTimeout服务器间请求(例如 fetchSockets() 或带有确认的 serverSideEmit())的超时时间5000v0.1.0
heartbeatInterval两次心跳之间的毫秒数5000v0.1.0
heartbeatTimeout在将节点视为已关闭之前,没有心跳的毫秒数10000v0.1.0
addCreatedAtField是否向每个 MongoDB 文档添加 createdAt 字段falsev0.2.0

常见问题

使用 MongoDB 适配器时,我是否仍然需要启用粘性会话?

是的。如果不这样做,会导致 HTTP 400 响应(您正在访问一个不知道 Socket.IO 会话的服务器)。

更多信息可以在这里找到 这里.

MongoDB 集群关闭时会发生什么?

如果与 MongoDB 集群的连接断开,行为将取决于 MongoDB 客户端的 bufferMaxEntries 选项的值

  • 如果其值为 -1(默认值),则数据包将在重新连接之前被缓冲。
  • 如果其值为 0,则数据包将仅发送到连接到当前服务器的客户端。

文档:http://mongodb.github.io/node-mongodb-native/3.6/api/global.html#MongoClientOptions

最新版本

版本发布日期发布说明差异
0.3.22024 年 1 月链接0.3.1...0.3.2
0.3.12024 年 1 月链接0.3.0...0.3.1
0.3.02023 年 2 月链接0.2.1...0.3.0
0.2.12022 年 5 月链接0.2.0...0.2.1
0.2.02022 年 4 月链接0.1.0...0.2.0
0.1.02021 年 6 月链接

完整变更日志

发射器

MongoDB 发射器允许从另一个 Node.js 进程向连接的客户端发送数据包

Diagram of how the MongoDB adapter worksDiagram of how the MongoDB adapter works

安装

npm install @socket.io/mongo-emitter mongodb

用法

const { Emitter } = require("@socket.io/mongo-emitter");
const { MongoClient } = require("mongodb");

const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0");

const main = async () => {
await mongoClient.connect();

const mongoCollection = mongoClient.db("mydb").collection("socket.io-adapter-events");
const emitter = new Emitter(mongoCollection);

setInterval(() => {
emitter.emit("ping", new Date());
}, 1000);
}

main();

请参考速查表 这里.