Нашёл пример чата на ноде под хайлоад(
код,
описание). Сделан с использованием воркеров через встроенную библиотеку 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 переданным потоком в кач-ве замыкания?
Мне кажется, что тут есть какой-то момент который я упускаю из виду(