Задать вопрос

Highload чат на node.js, clustering, redis. Как происходит broadcasting сообщений?

Нашёл пример чата на ноде под хайлоад(код, описание). Сделан с использованием воркеров через встроенную библиотеку cluster + redis hashring. Бродкастинг сообщений, судя по описанию сделан через redis pub/sub, но я не могу понять как он работает. Воркеры с мастером никак не общаются.

Изначально соединение начинается с handshake, генерируется случайный id, который служит ключом для каждого коннекта. Само connection, насколько я понял в стиле node, является readable stream. Когда приходит сообщение, то из него извлекается команда и в соответствии с ней вызывается соответствующая функция. Handshake вызывает initSession из chatManager.js, которому в кач-ве аргументов передаётся сообщение и connection stream. В initSession происходит создание и инициализация полей в connection stream и создаётся подписка на канал группы.

Вот собственно главные вопросы, у меня, по ф-циям: subscribe(connection) из файла initSession и listenChannel(channelId, onMessageCallback, context, callback) из messageManager.js.

Зачем везде хранить коннекты в массивах и объектах, ведь они между воркерами никак не синхронизируются, да и зачем это делать, если всё происходит через pub/sub? Соответственно почему рассылка сообщений (функция onMessage, которая передаётся в кач-ве колбэка) происходит через перебор этих сохранённых коннектов, а не просто через callback по сообщению из редиса c переданным потоком в кач-ве замыкания?

Мне кажется, что тут есть какой-то момент который я упускаю из виду(
  • Вопрос задан
  • 3278 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Передача хендлов сокетов в дочерние процессы тут находится во встроенной библиотеке cluster и скрыта от разработчика. Так же все процессы пишут и читают из редиса (см в коде вызовы incr/decr, zrem/zadd). Процессы подписываются на редисовские каналы (см в коде conn.on('message'...) и conn.on('subscribe'...) ). Код в этом репозитории уже три года не изменялся, масштабирование только на несколько процессов на одной машине, ничего уникального не написано, весь этот функционал сидит в редисе, будет тратиться много ресурсов, чтобы обеспечить межпроцессовое взаимодействие ноды с ним, даже не интересно смотреть эту реализацию. Это устаревший хлам, за три года нода уже изменилась, а как изменилась инфраструктура и возможности дополнительных пакетов...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы