Spec-Zone.ru › Socket.IO 4

MongoDB адаптер

Как это работает

Адаптер MongoDB опирается на Потоки изменений MongoDB (и, следовательно, требует реплицирующего набора или фрагментированного кластера).

Каждый пакет, отправленный нескольким клиентам (например, io.to("room1").emit() или socket.broadcast.emit()),:

  • отправляется всем соответствующим клиентам, подключенным к текущему серверу
  • вставляется в ограниченную коллекцию MongoDB и принимается другими серверами Socket.IO кластера

Diagram of how the MongoDB adapter works

Исходный код этого адаптера можно найти здесь.

Установка

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:

Diagram of how the MongoDB emitter 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", {
  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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API