архитектура многопользовательского игрового сервера node.js - PullRequest
2 голосов
/ 29 мая 2011

Скажем, вы делаете сервер Техасского Холдема. У нас есть одно лобби и несколько комнат, в которых проходят игровые сессии. На каком уровне вы разделяете комнаты?

Первоначально я думал, что создам экземпляр узла для каждой комнаты в вестибюле. Основным преимуществом является то, что в случае сбоя игры она, безусловно, будет делать это изолированно.

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

Есть мысли? Имеет ли смысл «мультиплексировать» один сервер узла для управления несколькими сеансами игровой комнаты?

Ответы [ 2 ]

5 голосов
/ 29 мая 2011

Технически, вам не нужно слушать отдельные порты для каждой комнаты.Это возможно, поскольку ОС поддерживает родительский и дочерний процессы, использующие один и тот же дескриптор сокета (файла).Для этого можно использовать модуль узла WebWorker .Благодаря этой архитектуре вы автоматически получаете модуль балансировки нагрузки, который может распределять входящие соединения между различными дочерними процессами с помощью планировщика процессов ОС.

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

Я бы порекомендовал вам сначала построить свою систему, используя архитектуру процессов с одним узлом (если вы собираетесь использовать websocket, вы уже можете обрабатывать довольно большое количество одновременных подключений), затем, когда вам нужно расширить систему, используйте архитектуру web-работника.Более того, миграция не займет много времени, если вы уже используете общее место для хранения / извлечения данных (база данных, memcached, redis keystore ...).

0 голосов
/ 11 мая 2012

Я бы порекомендовал Hook.io для вашего приложения. Это структура, позволяющая процессам нескольких узлов общаться через события.

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