Сервер сокетов tcp Node.js на нескольких машинах - PullRequest
5 голосов
/ 26 сентября 2011

У меня есть tcp-сервер node.js, который используется в качестве бэкенда для клиента чата на iPhone. Поскольку моя реализация включает приватные групповые чаты, я храню список пользователей и то, к какой комнате чата они принадлежат, в памяти, чтобы правильно направлять сообщения. Это хорошо работает, если предположить, что мой чат-сервер всегда будет на одной машине, но когда / если мне нужно масштабировать по горизонтали, мне нужен хороший способ передачи сообщений клиентам, которые подключаются к разным серверам. Я не хочу начинать межпроцессное взаимодействие между серверами узлов и предпочел бы делиться состоянием с redis.

У меня есть несколько идей, но мне интересно, есть ли у кого-нибудь хорошее решение для этого? Для ясности вот пример:

Пользователь 1 подключается к серверу 1 в комнате X, пользователь 2 подключается к серверу 2 в комнате X. Пользователь 1 отправляет сообщение, мне нужно передать его пользователю 2, но, поскольку я использую структуру данных в памяти, серверы не разделяют состояние. Я хочу, чтобы мои серверы узлов оставались настолько тупыми, насколько это возможно, поэтому я могу просто добавлять / удалять их для нужд моей системы.

Спасибо:)

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

Вы можете использовать слой сообщений (используя что-то вроде pub / sub), который охватывает процессы:

                             Message Queue
-------------------------------------------------------------------------------
            |                                     |
         ServerA                               ServerB
         -------                               -------
Room 1: User1, User2                  Room 1: User3, User5
Room 2: User4, User7, User11          Room 2: User6, User8
Room 3: User9, User13                 Room 3: User10, User12, User14

Допустим, пользователь1 отправляет сообщение в чат. Сервер A отправляет сообщение в очередь сообщений, в котором говорится: «Пользователь1 в комнате 1 сказал что-то» (вместе с тем, что они сказали). Каждый из процессов вашего другого сервера прослушивает такие события, поэтому в этом примере ServerB увидит, что ему нужно распространить сообщение от User1 всем пользователям в его собственной комнате 1. Вы можете масштабировать до многих процессов. таким образом - каждый новый процесс просто должен убедиться, что он прослушивает соответствующие сообщения в очереди.

Redis имеет функциональность pub / sub , которую вы можете использовать для этого, если вы уже используете Redis. Кроме того, существуют другие сторонние инструменты для такого рода вещей, такие как ZeroMQ ; см. также этот вопрос .

0 голосов
/ 26 сентября 2011

Redis должен иметь встроенную поддержку кластера в ближайшем будущем, тем временем вы можете использовать согласованный алгоритм хеширования для равномерного распределения ключей по нескольким серверам. У кого-то есть модуль хеширования для node.js, который был написан специально для реализации согласованного хеширования для модуля кластера redis для node.js. Возможно, вы захотите отключить имя «комнаты», чтобы все точки данных для комнаты оказались на одном хосте. При таком типе настройки вся логика, которую должен использовать сервер, остается на клиенте, поэтому ваш кластер redis может в основном оставаться прежним, и вы можете легко добавлять или удалять хосты.

Обновление

Я нашел согласованную реализацию хэширования для redis, о которой я говорил, она, конечно, дает код, а также объясняет шардинг в простом для понимания виде.

http://ngchi.wordpress.com/2010/08/23/towards-auto-sharding-in-your-node-js-app/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...