Горизонтальное масштабирование socket.io с помощью Redis

В настоящее время я создаю горизонтально масштабируемый сервер socket.io, который выглядит следующим образом:

                 LoadBalancer (nginx)

      Proxy1      Proxy2      Proxy3      Proxy{N}

 BackEnd1   BackEnd2   BackEnd3   BackEnd4   BackEnd{N}

Мой вопрос: с модулем socket-io redis могу ли я отправить сообщение в определенный сокет, подключенный к одному из прокси-серверов, с одного из внутренних серверов, если все они подключены к одному и тому же серверу Redis? Если да, то как мне это сделать?


person Steve P    schedule 11.12.2015    source источник


Ответы (2)


Поскольку вы хотите масштабировать сервер socket.io и используете nginx в качестве балансировщика нагрузки, не забудьте настроить sticky load balancing, в противном случае одно соединение будет подключено к нескольким серверам на основе балансировщика нагрузки, передающего соединение с сервером socket.io. Так что лучше использовать sticky load balancing

С адаптером Redis Socket io вы можете отправлять и получать сообщения с одним или несколькими серверами socket.io с помощью Redis Pub/Sub implementation.

если вы скажете мне, какая технология используется для прокси и бэкенда, я дам вам больше информации об этом.

person Hiren S.    schedule 11.12.2015
comment
Все серверы используют Node.js, я просто спрашиваю, как я могу отправить клиенту с одного из внутренних серверов, если все они подключены к одному и тому же хранилищу Redis. - person Steve P; 13.12.2015

Используя модуль socket.io-redis, все ваши внутренние серверы будут использовать один и тот же пул подключенных пользователей. Вы можете отправить сообщение из Backend1, и если клиент подключен к Backend4, он получит сообщение.

Ключом к этой работе с Socket.io является использование фиксированных сеансов на nginx, чтобы после подключения клиента он оставался на той же машине. Это связано с тем, что socket.io начинается с WebSocket и нескольких длинных потоков опроса, и все они должны находиться на одном и том же внутреннем сервере для правильной работы.

Вместо фиксированных сеансов вы можете изменить параметры подключения клиента, чтобы использовать ТОЛЬКО веб-сокеты, и это устранит проблемы с несколькими подключениями к нескольким серверам, поскольку будет только одно соединение, один веб-сокет. Это также приведет к тому, что ваше приложение потеряет возможность перехода на длительный опрос вместо WebSockets.

person greg_diesel    schedule 15.12.2015
comment
Эй, спасибо за ответ. По какой-то причине это все еще не работает для меня. Не могли бы вы взглянуть на эту ветку и сообщить мне, как лучше поступить? stackoverflow.com/questions/34325229/ - person Steve P; 17.12.2015