2016-09-01 3 views
0

У меня есть многопользовательская игра на основе библиотеки socket.io, и я хочу масштабировать ее на несколько потоков. Я узнал, что node.js имеет кластерный модуль для обработки многопоточности. Мой игровой мир состоит из нескольких зон, и я хочу, чтобы каждая зона обрабатывалась в собственном процессе. Мне нужен способ передать пользовательский сокет конкретному рабочему, чтобы пользователь мог перейти из зоны в зону. Я читал в node.js docs, что модуль кластера использует метод round-robin для выбора рабочего для каждого соединения. Может быть, есть какие-либо способы обхода соединений?Node.js кластер, проходящий соединение с конкретным работником

+0

вы можете получить креатив и начать процессы и связаться с ними через какую-то очередь, например 0mq. Это не то, что вы ищете в качестве ответа, но это может быть спад – akaphenom

+0

Привет, @akaphenom, спасибо за ваш ответ. Я никогда не слышал о zmq раньше. Возможно, у вас есть ссылки на то, как справляться с подобными ситуациями, используя zmq и node.js? – Gugis

+0

Я думаю, что вы можете решить это, просто используя веб-сервер, например 'nginx' или' HAProxy'. Вы можете запускать несколько экземпляров одного и того же приложения на каждом сервере с помощью 'Docker', а затем использовать' nginx' или 'HAProxy' для загрузки баланса. –

ответ

1

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

Как таковой, я думаю, что вы должны просто запустить количество процессов, которые вы хотите, назначить им каждый порт, специфичный для этой зоны, а затем отправить клиенту запрос Ajax владельцу, спрашивающий, какой порт если они выполняют соединение socket.io для своей зоны. Клиент получает этот ответ ajax, а затем подключается непосредственно к соответствующему серверу для своей зоны. Все ваши серверы socket.io должны будут разрешать запросы перекрестного происхождения из требуемого домена/порта главной страницы.

Подключение к серверу для зоны может быть выполнено через порт, как описано выше, или это можно сделать с помощью отдельного имени хоста, такого как zone1.mygameserver.com, а затем использовать что-то вроде nginx для маршрутизации всех разных хостов на определенные порты на вашем сервере коробка.

+0

Итак, когда пользователь хочет выйти из одной зоны и ввести другого клиента, необходимо отключиться от текущего сервера зоны и подключиться к новой зоне? Но что, если переход между зонами должен быть незаметным, без загрузки экрана и т. Д.? – Gugis

+0

@Gugis - Вы говорите о соединении socket.io. Закрытие одного подключения socket.io и открытие другого не оказывает никакого влияния на экран пользователя или на текущую страницу или что-то еще, это совершенно невидимо для пользователя. – jfriend00

+0

Но как можно безопасно переносить сеанс? – Gugis

Смежные вопросы