Масштабирование сервера узла веб-сокета

Я знаю, что этот вопрос частично задавался ранее (Как масштабировать Node.js WebSocket Redis Server?), но мне интересно, есть ли какие-либо альтернативы Redis для быстрого обмена объектами веб-сокетов между экземплярами узла, в частности, сокеты типа ws (https://github.com/einaros/ws). Я пробовал Redis и столкнулся с проблемами, связанными с тем, что объекты веб-сокетов цикличны и их трудно сериализовать. Затем я использовал цикл Crockford.js (https://github.com/douglascrockford/JSON-js/blob/master/cycle.js), однако, похоже, он исключает методы объектов websocket, так как я получаю сообщение об ошибке от node, говорящее: «Объект объекта не имеет метода отправки» после того, как я прочитал сокет обратно от redis и переработал его. Любая помощь приветствуется.

Заранее спасибо, Джеймс.


person jamyspex    schedule 04.02.2014    source источник
comment
Я немного не уверен, чего вы пытаетесь достичь. Что именно вы имеете в виду, разделяя объекты веб-сокетов? Вы пытаетесь создать систему чата и используете Redis для хранения информации о подключении к веб-сокету, и вы используете эту информацию для чата?   -  person Jack Daniel's    schedule 05.02.2014
comment
Я в основном создаю систему, которая позволяет передавать сообщения с телефона Android на расширение Chrome. В настоящее время у меня есть массив сокетов браузера и массив сокетов Android, хранящихся локально в node. Проблема заключается в том, что если я запускаю более одного экземпляра узла, а браузер и телефон пользователей подключаются к разным экземплярам, ​​не будет возможности переслать сообщение туда, куда оно предназначено. Надеюсь, это прояснит ситуацию, Джеймс. @Атул   -  person jamyspex    schedule 05.02.2014


Ответы (2)


IMO, вы должны использовать для этого очередь сообщений... например (RabbitMQ)

  1. Приложение запускается на узле A и узле B и подключается к RabbitMQ.
  2. Клиент A подключается к узлу A и подписывается на очередь с именем XXX Client.
  3. Клиент B подключается к узлу B и подписывается на очередь с именем XXX.
  4. Клиент A отправляет сообщение серверу websocket Сервер Websocket отправляет сообщение узлу A
  5. Узел A публикует сообщения в очередь RabbitMQ XXX
  6. Узел B получает сообщение от RabbitMQ, так как он подписан на очередь XXX.
  7. Узел B отправляет сообщение клиенту B или публикует сообщения для всех подключенных клиентов на узле B.

Итак, все, что вам нужно, это поместить очередь сообщений в вашу архитектуру (RabbitMQ, ZeroMQ) и т. д.

person Jack Daniel's    schedule 05.02.2014
comment
Спасибо за ответ. Я не уверен, что это полностью решает мою проблему, но я думаю, что RabbitMQ и т. д. могут дать ответ. Спасибо, Джеймс. - person jamyspex; 05.02.2014
comment
Извините, но я подумал и вернулся, настоящая проблема заключается в том, что Redis, RabbitMQ и т. д. все отправляют текстовые сообщения/сообщения PubSub, поэтому проблема возникает при попытке отправить объекты ws (github.com/einaros/ws), потому что их сложно преобразовать в строки. Есть ли надежное решение для этого. - person jamyspex; 05.02.2014
comment
Что именно вы пытаетесь сделать? Вы хотите передать сообщение всем пользователям, подключенным к серверу узла? или вы хотите отправить сообщение конкретному пользователю? - person Jack Daniel's; 12.02.2014
comment
Привет, это для конкретного пользователя. - person jamyspex; 12.02.2014
comment
И вы правильно храните соединение в Redis? и горлышко бутылки не сериализовано должным образом для хранения в Redis? - person Jack Daniel's; 12.02.2014
comment
@Jack Daniel's Мне нужно внедрить Redis для обмена сообщениями между пользователями, подключенными к разным экземплярам сервера. Не могли бы вы посоветовать мне, что делать? - person Jack M.; 08.08.2014
comment
@ДжекМ. Я бы посоветовал вам использовать для этого очередь сообщений (RabbitMQ, ActiveMQ, ZeroMQ и т. д.) вместо Redis. - person Jack Daniel's; 11.08.2014

Существует библиотека, которая позволяет легко масштабировать WebSocket для процессов и машин node.js, вы можете проверить это:

https://github.com/ClusterWS/ClusterWS

person Dmitrii Goriunov    schedule 03.01.2018