Использование с 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 включает в себя два дополнительных пакета:
Единственное отличие от pm2 происходит из этого коммита:
- процесс God теперь создает собственный HTTP-сервер и маршрутизирует HTTP-запросы на нужный рабочий процесс
- процесс God также пересылает пакеты между рабочими процессами, чтобы
io.emit()правильно достигал всех клиентов
Обратите внимание, что если у вас есть несколько хостов, каждый из которых работает с кластером PM2, вам необходимо использовать другой адаптер, например, адаптер Redis.
Исходный код форка можно найти здесь. Мы постараемся следовать релизам пакета pm2.
© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v4/pm2