Как получить процессы node.js общаться друг с другом

StackOverflow https://stackoverflow.com/questions/6814165

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Как сказал йоджимбо87, вы сначала просто используете Redis pub/sub (очень оптимизирован).

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top