Как получить процессы node.js общаться друг с другом
Вопрос
У меня есть приложение 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. Анкет Я также хотел бы проверить это, потому что я думаю, что чем раньше у вас появится это, тем лучше?