Spec-Zone.ru › Socket.IO 4

Адаптер

Адаптер — это компонент на стороне сервера, отвечающий за рассылку событий всем или подмножеству клиентов.

При масштабировании до нескольких серверов Socket.IO вам необходимо заменить стандартный адаптер в памяти на другую реализацию, чтобы события корректно передавались всем клиентам.

Помимо адаптера в памяти, существуют четыре официальные реализации:

  • адаптер Redis
  • адаптер MongoDB
  • адаптер Postgres
  • адаптер Кластера

Также есть несколько других вариантов, поддерживаемых замечательным сообществом:

  • AMQP (например, RabbitMQ)
  • NATS
  • NATS

Обратите внимание, что при использовании нескольких серверов Socket.IO и HTTP long-polling всё ещё требуется включение sticky сессий. Дополнительная информация здесь.

API

Доступ к экземпляру адаптера можно получить с помощью:

// main namespace
const mainAdapter = io.of("/").adapter; // WARNING! io.adapter() will not work
// custom namespace
const adminAdapter = io.of("/admin").adapter;

Начиная с socket.io@3.1.0, каждый экземпляр адаптера излучает следующие события:

  • create-room (аргумент: комната)
  • delete-room (аргумент: комната)
  • join-room (аргумент: комната, id)
  • leave-room (аргумент: комната, id)

Пример:

io.of("/").adapter.on("create-room", (room) => {
  console.log(`room ${room} was created`);
});

io.of("/").adapter.on("join-room", (room, id) => {
  console.log(`socket ${id} has joined room ${room}`);
});

Эмиттер

Большинство реализаций адаптеров поставляются со своим соответствующим пакетом эмиттера, который позволяет взаимодействовать с группой серверов Socket.IO из другого процесса Node.js.

Emitter diagram

Это может быть полезно, например, в среде микросервисов, где все клиенты подключаются к микросервису M1, а микросервис M2 использует эмиттер для трансляции пакетов (однонаправленное взаимодействие).

Справочник по эмиттеру

// to all clients
emitter.emit(/* ... */);

// to all clients in "room1"
emitter.to("room1").emit(/* ... */);

// to all clients in "room1" except those in "room2"
emitter.to("room1").except("room2").emit(/* ... */);

const adminEmitter = emitter.of("/admin");

// to all clients in the "admin" namespace
adminEmitter.emit(/* ... */);

// to all clients in the "admin" namespace and in the "room1" room
adminEmitter.to("room1").emit(/* ... */);

Эмиттер также поддерживает вспомогательные методы, добавленные в socket.io@4.0.0:

  • socketsJoin()
// make all Socket instances join the "room1" room
emitter.socketsJoin("room1");

// make all Socket instances of the "admin" namespace in the "room1" room join the "room2" room
emitter.of("/admin").in("room1").socketsJoin("room2");
  • socketsLeave()
// make all Socket instances leave the "room1" room
emitter.socketsLeave("room1");

// make all Socket instances in the "room1" room leave the "room2" and "room3" rooms
emitter.in("room1").socketsLeave(["room2", "room3"]);

// make all Socket instances in the "room1" room of the "admin" namespace leave the "room2" room
emitter.of("/admin").in("room1").socketsLeave("room2");
  • disconnectSockets()
// make all Socket instances disconnect
emitter.disconnectSockets();

// make all Socket instances in the "room1" room disconnect (and discard the low-level connection)
emitter.in("room1").disconnectSockets(true);

// make all Socket instances in the "room1" room of the "admin" namespace disconnect
emitter.of("/admin").in("room1").disconnectSockets();

// this also works with a single socket ID
emitter.of("/admin").in(theSocketId).disconnectSockets();
  • serverSideEmit()
// emit an event to all the Socket.IO servers of the cluster
emitter.serverSideEmit("hello", "world");

// Socket.IO server (server-side)
io.on("hello", (arg) => {
  console.log(arg); // prints "world"
});

© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v4/adapter

Spec-Zone.ru

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