У меня есть многопользовательская игра на основе библиотеки socket.io, и я хочу масштабировать ее на несколько потоков. Я узнал, что node.js имеет кластерный модуль для обработки многопоточности. Мой игровой мир состоит из нескольких зон, и я хочу, чтобы каждая зона обрабатывалась в собственном процессе. Мне нужен способ передать пользовательский сокет конкретному рабочему, чтобы пользователь мог перейти из зоны в зону. Я читал в node.js docs, что модуль кластера использует метод round-robin для выбора рабочего для каждого соединения. Может быть, есть какие-либо способы обхода соединений?Node.js кластер, проходящий соединение с конкретным работником
ответ
Я не совсем уверен, что кластеризация - правильное решение для вас. Основным преимуществом кластеризации является то, что она автоматически выполняет балансировку входящих соединений между различными процессами. Но вы не хотите использовать эту возможность - вы хотите вручную назначить каждое соединение процессу, обрабатывающему данную зону.
Как таковой, я думаю, что вы должны просто запустить количество процессов, которые вы хотите, назначить им каждый порт, специфичный для этой зоны, а затем отправить клиенту запрос Ajax владельцу, спрашивающий, какой порт если они выполняют соединение socket.io для своей зоны. Клиент получает этот ответ ajax, а затем подключается непосредственно к соответствующему серверу для своей зоны. Все ваши серверы socket.io должны будут разрешать запросы перекрестного происхождения из требуемого домена/порта главной страницы.
Подключение к серверу для зоны может быть выполнено через порт, как описано выше, или это можно сделать с помощью отдельного имени хоста, такого как zone1.mygameserver.com
, а затем использовать что-то вроде nginx для маршрутизации всех разных хостов на определенные порты на вашем сервере коробка.
Итак, когда пользователь хочет выйти из одной зоны и ввести другого клиента, необходимо отключиться от текущего сервера зоны и подключиться к новой зоне? Но что, если переход между зонами должен быть незаметным, без загрузки экрана и т. Д.? – Gugis
@Gugis - Вы говорите о соединении socket.io. Закрытие одного подключения socket.io и открытие другого не оказывает никакого влияния на экран пользователя или на текущую страницу или что-то еще, это совершенно невидимо для пользователя. – jfriend00
Но как можно безопасно переносить сеанс? – Gugis
- 1. cookie, проходящий через соединение HTTPS
- 2. События и кластер Node.js
- 3. Node.js Кластер не прослушивает
- 4. Одно соединение сокета на кластер
- 5. Node.js кластер - оптимальное количество рабочих
- 6. Cassandra большой кластер настраивает соединение с клиентом
- 7. Кластер Hadoop и соединение с клиентом
- 8. use node.js кластер с приложением socket.io chat
- 9. Как использовать кластер socket.io Node.js?
- 10. Связать HTTP-соединение с конкретным адаптером (Подсказка: Измеренное соединение)
- 11. чат с конкретным пользователем в node.js
- 12. MVP с фоновым работником (Исключено)
- 13. Онлайн-статус с обслуживающим работником
- 14. Фрагмент Кэширование с фоновым работником
- 15. Самомодифицирующий код в node.js, будет работать кластер?
- 16. node.js кластер получает все рабочие данные
- 17. Закрыть соединение MySQL Node.js
- 18. node.js - перенаправляет клиент в наименее загруженный кластер
- 19. Доступ рабочей среды от мастера (кластер Node.js)
- 20. Node.js соединение Cassandra таймаут
- 21. Node.js: Соединение между серверами
- 22. Соединение SuperAgent + Node.js Отказано
- 23. Node.js - сервер закрыл соединение?
- 24. Как закрыть соединение с cassandra с node.js
- 25. Node.js + setInterval = Соединение потеряно: сервер закрыл соединение
- 26. Получить данные, возвращенные работником
- 27. Не удается закрыть соединение MongoDB с Node.js?
- 28. Соединение сокетов TCP с Node.JS и AWS
- 29. множественное соединение с MongoDB в node.js
- 30. Соединение на стороне сервера Node.js с Socket.io
вы можете получить креатив и начать процессы и связаться с ними через какую-то очередь, например 0mq. Это не то, что вы ищете в качестве ответа, но это может быть спад – akaphenom
Привет, @akaphenom, спасибо за ваш ответ. Я никогда не слышал о zmq раньше. Возможно, у вас есть ссылки на то, как справляться с подобными ситуациями, используя zmq и node.js? – Gugis
Я думаю, что вы можете решить это, просто используя веб-сервер, например 'nginx' или' HAProxy'. Вы можете запускать несколько экземпляров одного и того же приложения на каждом сервере с помощью 'Docker', а затем использовать' nginx' или 'HAProxy' для загрузки баланса. –