Как заставить процессы Node.js общаться друг с другом - PullRequest
3 голосов
/ 25 июля 2011

У меня есть приложение чата nodejs, в котором несколько клиентов подключаются к общей комнате чата с помощью socketio. Я хочу масштабировать это на несколько узловых процессов, возможно на разных машинах. Однако клиенты, которые подключаются к одной и той же комнате, не гарантируют попадание в один и тот же процесс узла. Например, пользователь 1 нажмет на процесс узла A, а пользователь 2 нажмет на процесс узла B. Они находятся в одной комнате, поэтому, если пользователь 1 отправляет сообщение, пользователь 2 должен его получить. Каков наилучший способ сделать это, так как их соединения управляются разными процессами?

Я думал о том, чтобы подключить процессы узла к redis. Это, по крайней мере, решает проблему, заключающуюся в том, что процесс A узнает , что в комнате есть другой пользователь, пользователь 2, но он все еще не может отправить пользователю 2, поскольку процесс B контролирует это соединение. Есть ли способ зарегистрировать обратный вызов «значение изменено» для redis?

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

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

Оба процесса node.js могут быть подписаны на некоторый канал через redis pub / sub и прослушивать сообщения, которые вы передаете этому каналу.Например, когда пользователь 1 подключается к процессу A на первом компьютере, вы можете сохранить в Redis информацию об этом пользователе вместе с информацией о том, каким процессом этот компьютер управляет.Затем, когда пользователь 2, подключенный к процессу B на втором компьютере, отправляет сообщение пользователю 1, вы можете опубликовать его на этом канале и проверить, какой процесс на каком компьютере отвечает за управление связью с пользователем 1, и ответить соответствующим образом.

3 голосов
/ 25 июля 2011

Я провел (сделал) некоторое исследование по этому вопросу.Ниже мои выводы:

Как yojimbo87 сказал, что вы сначала просто используете redis pub / sub (очень оптимизировано).

http://comments.gmane.org/gmane.comp.lang.javascript.nodejs/22348

Тим Кэсвелл написал:

По моему опыту, узким местом является сериализация и десериализация данных, а не фактический канал.Я почти уверен, что вы можете использовать именованные каналы, но я не уверен, что такое API.msgpack кажется хорошим форматом для обмена данными.Есть несколько библиотек, которые реализуют msgpack или ipc-фреймворки поверх него.

Но когда сериализация / десериализация станет вашим узким местом, я попробую использовать https://github.com/pgriess/node-msgpack. Я бытакже хотел бы проверить это, потому что я думаю, что чем раньше у вас это получится, тем лучше?

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