Spec-Zone.ru › Socket.IO 4

Использование с PM2

PM2 — это менеджер производственного процесса для приложений Node.js со встроенным балансировщиком нагрузки. Он позволяет поддерживать приложения в активном состоянии постоянно, перезагружать их без простоев и упрощать общие задачи системного администрирования.

Документацию можно найти здесь: https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/

Для масштабирования сервера Socket.IO с помощью PM2 существует три решения:

  • отключить HTTP-длительные опросы на стороне клиента
const socket = io({
  transports: ["websocket"]
});

Однако в этом случае не будет резервного копирования на HTTP-длительные опросы, если подключение WebSocket не может быть установлено.

  • использовать отдельный порт для каждого рабочего процесса и балансировщик нагрузки, например nginx, перед ними
  • использовать @socket.io/pm2

Установка

npm install -g @socket.io/pm2

Если pm2 уже установлен, необходимо его сначала удалить:

npm remove -g pm2

@socket.io/pm2 может быть использован как прямая замена для pm2, и поддерживает все команды утилиты класса pm2.

Единственное отличие происходит из этого коммита.

Использование

worker.js

const { createServer } = require("http");
const { Server } = require("socket.io");
const { createAdapter } = require("@socket.io/cluster-adapter");
const { setupWorker } = require("@socket.io/sticky");

const httpServer = createServer();
const io = new Server(httpServer);

io.adapter(createAdapter());

setupWorker(io);

io.on("connection", (socket) => {
  console.log(`connect ${socket.id}`);
});

ecosystem.config.js

module.exports = {
  apps : [{
    script    : "worker.js",
    instances : "max",
    exec_mode : "cluster"
  }]
}

Затем запустите pm2 start ecosystem.config.js (или pm2 start worker.js -i 0). Это все! Теперь вы можете получить доступ к кластеру Socket.IO по порту 8080.

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

При масштабировании на несколько узлов с помощью нескольких узлов, необходимо выполнить две вещи:

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

Для этого @socket.io/pm2 включает в себя два дополнительных пакета:

  • @socket.io/sticky
  • @socket.io/cluster-adapter

Единственное отличие от pm2 происходит из этого коммита:

  • процесс God теперь создает собственный HTTP-сервер и маршрутизирует HTTP-запросы на нужный рабочий процесс
  • процесс God также пересылает пакеты между рабочими процессами, чтобы io.emit() правильно достигал всех клиентов

Обратите внимание, что если у вас есть несколько хостов, каждый из которых работает с кластером PM2, вам необходимо использовать другой адаптер, например, адаптер Redis.

Исходный код форка можно найти здесь. Мы постараемся следовать релизам пакета pm2.

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

Spec-Zone.ru

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