Как масштабировать чат написанный на socket.io/nodejs?

Здравствуйте!

Я написал некое подобие чата на socket.io и хочу его масштабировать на два сервера.

Прочитал вот это this: socket.io/docs/using-multiple-nodes/#passing-event... настроил nginx и теперь клиент попадает на один из этих серверов.

Проблема в том что я использую переменную в каждом socket.io инстансе для того чтобы хранить список людей в комнате и названия этих комнат.

Если один человек подключился к одному инстансу, а другой к другому то они друг друга не видят.

Из вышеприведенной статьи прочитал про redis adpter. Я думал что я добавлю эти строки и мои два инстанса будут синхронизированы через redis. Но этого не произошло.

Вот мой код:

//FIRST SERVER (server1.js)

var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

var test = 0;

io.on('connection', function (socket) {
    test+=1;
    console.log("connection. test = " + test);
});

//SECOND SERVER (server2.js)


var io = require('socket.io')(4000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

var test = 0;

io.on('connection', function (socket) {
    test+=1;
    console.log("connection. test = " + test);
});

Когда клиент подключается к server1.js (port 3000) - я вижу 'connection. test = 1', это хорошо, но консоль в которой запущен второй инстанс остается пустой. Я хочу чтобы второй инстанс делал тоже самое (печатал 'connection = 1').

Что я делаю не так? Может кто нибудь знает где можно увидеть пример использования socket.io-redis

Спасибо
  • Вопрос задан
  • 3863 просмотра
Решения вопроса 2
undassa
@undassa
Last.Backend
io.on('connection', function (socket) {
//
});


Данное событие сработает при успешном создании постоянного соединения между клиентом и сервером.
Так как сокет соединение - это соединение в единственном экземпляре, то оно попадёт либо на 1й инстанс либо на 2й инстанс. И данное событие сработает либо тут либо там.

Если уж вам по какой то причине необходимо увидеть в консоли событие подключения в обоих инстансах,
я бы попробовал следующее:

1. Использовал бы в качестве канала между инстансами нативный модуль redis.
2. При успешном подключении послал бы в канал redis.publish уведомление по новом подключении

НО! Необходимо вручную определять события которые надо прикидывать на второй инстанс, иначе от такого масштабирования нет толку, потому что оба инстанса будут обрабатывать одни и теже команды.

Резюмируя: В этом нет смысла. Если есть необходимость - надо просто через редис уведомить второй сервис.
Ответ написан
@Mak1012
А не проще использовать один Redis сервер?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы