MongoDB адаптер
Как это работает
Адаптер MongoDB опирается на Потоки изменений MongoDB (и, следовательно, требует реплицирующего набора или фрагментированного кластера).
Каждый пакет, отправленный нескольким клиентам (например, io.to("room1").emit() или socket.broadcast.emit()),:
- отправляется всем соответствующим клиентам, подключенным к текущему серверу
- вставляется в ограниченную коллекцию MongoDB и принимается другими серверами Socket.IO кластера
Исходный код этого адаптера можно найти здесь.
Установка
npm install @socket.io/mongo-adapter mongodb
Для пользователей TypeScript вам также может потребоваться @types/mongodb.
Использование
Существует два способа очистки документов MongoDB, созданных адаптером:
- ограниченная коллекция capped collection
- индекс TTL TTL index
Использование с ограниченной коллекцией
const { Server } = require("socket.io");
const { createAdapter } = require("@socket.io/mongo-adapter");
const { MongoClient } = require("mongodb");
const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";
const io = new Server();
const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0", {
useUnifiedTopology: true,
});
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);
io.adapter(createAdapter(mongoCollection));
io.listen(3000);
}
main();
Использование с индексом TTL
const { Server } = require("socket.io");
const { createAdapter } = require("@socket.io/mongo-adapter");
const { MongoClient } = require("mongodb");
const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";
const io = new Server();
const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0", {
useUnifiedTopology: true,
});
const main = async () => {
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);
}
main();
Параметры
| Имя | Описание | Значение по умолчанию | Добавлен в |
|---|---|---|---|
uid |
Идентификатор этого узла | случайный идентификатор | v0.1.0 |
requestsTimeout |
Таймаут для межсерверных запросов, таких как fetchSockets() или serverSideEmit() с подтверждением |
5000 |
v0.1.0 |
heartbeatInterval |
Количество мс между двумя сердцебиениями | 5000 |
v0.1.0 |
heartbeatTimeout |
Количество мс без сердцебиения, прежде чем мы посчитаем узел неактивным | 10000 |
v0.1.0 |
addCreatedAtField |
Добавлять ли поле createdAt к каждому документу MongoDB |
false |
v0.2.0 |
Часто задаваемые вопросы
- Нужно ли по-прежнему включать склеенные сессии при использовании адаптера MongoDB?
Да. Если этого не сделать, результатом будут HTTP-отклики 400 (вы обращаетесь к серверу, который не знает о сессии Socket.IO).
Дополнительную информацию можно найти здесь.
- Что происходит, когда кластер MongoDB недоступен?
В случае разрыва соединения с кластером MongoDB поведение будет зависеть от значения параметра bufferMaxEntries клиента MongoDB:
- если его значение
-1(по умолчанию), пакеты будут буферизованы до повторного подключения. - если его значение
0, пакеты будут отправляться только тем клиентам, которые подключены к текущему серверу.
Документация: http://mongodb.github.io/node-mongodb-native/3.6/api/global.html#MongoClientOptions
Последние релизы
-
0.2.0(24.07.2022): Релиз на GitHub / разница -
0.1.0(01.06.2021): Релиз на GitHub
Эмиттер
Эмиттер MongoDB позволяет отправлять пакеты подключенным клиентам из другого процесса Node.js:
Установка
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", {
useUnifiedTopology: true,
});
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();
См. шпаргалку здесь.
© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v4/mongo-adapter