Масштабирование сервера узлов веб-сокетов
Я знаю, что этот вопрос частично задавался ранее ( как масштабировать Node.js WebSocket Redis Server?), Но мне интересно, есть ли альтернативы redis для быстрого совместного использования объектов websocket между экземплярами узла, в частности сокетов типа ws ( https://github.com/einaros/ws). Я попробовал redis и столкнулся с проблемами из-за того, что объекты веб-сокетов циклические и их трудно сериализовать. Затем я использовал Crockford's cycle.js ( https://github.com/douglascrockford/JSON-js/blob/master/cycle.js), однако кажется, что он удаляет методы объектов websocket, так как я получаю сообщение об ошибке от узла, говорящего "Объектный объект не имеет метода send" после того, как я прочитал сокет из redis и задал ему ретроциклирование. Любая помощь приветствуется.
Заранее спасибо, Джеймс.
3 ответа
IMO, вы должны использовать очередь сообщений для этого.. например (RabbitMQ)
- Приложение запускается на узле A и B и подключается к RabbitMQ
- Клиент A подключается к узлу A и подписывается на очередь с именем XXX Client
- Клиент B подключается к узлу B и подписывается на очередь с именем XXX
- Клиент A отправляет сообщение на сервер websocket Сервер Websocket отправляет сообщение на узел A
- Узел А публикует сообщения в очередь RabbitMQ XXX
- Узел B получает сообщение от RabbitMQ, поскольку оно подписано на очередь XXX
- Узел B отправляет сообщение клиенту B или публикует сообщения всем подключенным клиентам на узле B
Итак, все, что вам нужно, это поместить очередь сообщений в вашу архитектуру (RabbitMQ, ZeroMQ) и т. Д.
Есть библиотека, которая позволяет легко масштабировать WebSocket между процессами и машинами node.js, вы можете проверить это:
Когда мы говорим о масштабируемости, мы ожидаем или хотим услышать слова «линейный прирост производительности». Если честно, это не относится к большинству установок, поскольку их зависимость от другого сервера/службы слишком велика, и поэтому в сети, которую вы пытаетесь разместить для пользователей, возникают узкие места.
Когда мы изучаем варианты, мы слышим такие вещи, как базы данных, очереди сообщений и брокеры; Они хороши в использовании, но, как упоминалось выше, если полагаться на какой-либо из них слишком сильно, вы уничтожите свою установку в нужное время.
Разработайте сервер WSS для работы в одиночку (если только требования не будут превышены). Вы определяете и устанавливаете ограничения и сообщаете об этом серверу API. Итак, если у меня есть 10 чатов, и они вмещают максимум 100 пользователей, а тестирование моего WSS-сервера доказало, что я могу вместить 400-500 из них. С этой информацией я бы установил 4-5 комнат на сервер. Итак, если два человека входят в комнату № 1, они находятся на сервере № 1 WSS; Если все 10 чат-комнат заполнены, то WSS-сервер № 2 теперь заполнен, и 11-й комнате потребуется WSS-сервер № 3 до 15-й комнаты.
Самой медленной частью сети теперь будет только ваш сервер API, обрабатывающий запросы, но это может включать и базу данных.
Если вам требуется больше пользователей, чем в примере, вы можете сначала увеличить мощность ядра или добавить второй сервер с помощью настройки типа MQ или Redis Pub/Sub.
К сожалению, нет способа правильно отсортировать пользователей, поэтому, если в 3 комнатах по 20 пользователей, и все они сидят на WSS-сервере № 1, в комнате все равно останутся сотни доступных пользовательских слотов, но действительно ли это проблема?
Возможно, эта комната может заполниться сразу, поэтому оставьте их на месте, но все же могут пройти дни, пока они не достигнут максимума, поэтому программирование чего-то острого для ваших нужд улучшит вашу рентабельность.