1

У меня вопрос о масштабируемости. Предположим, у меня многопользовательская игра, такая как Uno, где сервер обрабатывает все. (Предположим, что это просто текстовая игра для простоты). Например, чтобы получить информацию, распечатанную пользователем на клиенте, сервер может отправить PRINT string или CHOOSE data (чтобы выбрать карту для воспроизведения) и т. Д. В этом отношении клиент «немой», и сервер обрабатывает игру логика.Масштабирование сервера по горизонтали

Быстрый пример того, как это может работать на уровне протокола:
сервер посылает: PRINT Choose a card
сервер посылает: CHOOSE Red 1,Blue 1 (пользователь показал кнопку или что-то, и выбирает красный 1)
Клиент посылает: Red 1

Скажем, у меня есть эта архитектура:
игрок класс: хранит карту пользователя имеет, возможно, некоторые методы (такие как tellData(String data), который будет отправлять данные для печати, sendPM() которые может личное сообщение пользователю)

серверного класса: выполняет проверку подлинности, позволяет пользователям создавать новые игры, показывает пользователям список игр, они могут присоединиться к

Game Class: ручки пользователи играют карты, ручки переход на новый игрок для своей очереди, вызывает методы класса игрока, как tellData(), pickCard() и т.д.

Как бы масштабировать это, чтобы запустить сервер на нескольких компьютерах? Прямо сейчас все пользователи подключаются к одному серверу и требуют, чтобы класс Player, Server и Game взаимодействовал друг с другом. Если кто-то может предоставить некоторые предложения и/или указать мне на некоторые хорошие ресурсы/книги по этому поводу, было бы весьма признательно (нет, это не домашнее задание или что-то для бизнеса, это всего лишь личный проект и любопытство мой). Что касается масштабируемости, я бы хотел просто добавить еще один сервер и обработать дополнительную нагрузку игроков, но большинство параллельных соединений будет 1000.

Кроме того, будет ли это значительно сложнее проблема масштабируемости, если мы добавим в другие игры?

Кроме того, что является лучшим способом хранения игровых данных? В базе данных SQL или сериализации объектов или что? Под этим я имею в виду, скажем, 3 пользователя находятся в игре Uno и хотят вернуться к нему позже. Я не хочу хранить свои карты и информацию об игре в классе Player/Server/Game (RAM) навсегда - я хочу свалить это где-то, поэтому, когда пользователь входит в систему, информация может быть загружена, однако это было сбрасывается в ОЗУ, а затем соответствующие объекты Player/Game.

Наконец, как я могу вносить изменения в сервер, не убивая его, и перезагружать его? Предположим, что сервер был написан на Java или Python.

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

Спасибо за любую помощь!

EDIT: Есть ли хорошие книги или разговоры, которые вы все бы порекомендовали по этому вопросу?

ответ

0

1.Scalability: включает в себя архитектуру приложения существует в нескольких экземплярах сервера сеанс реплицированного/общие и балансировка нагрузки. Вы можете выбрать очередь сообщений (rabbitmq)/ESB (корпоративная шина обслуживания) для вашего приложения.

2.Ease of scaling: В зависимости от места размещения и выбранные вами серверы.

3.Pesistance: Игра для человека связана с его конкретным игровым состоянием в любой момент времени. Если вы могли бы представлять информацию состояния семантически, вы можете иметь данные в файлах сохранения разметки или хранить информацию о состоянии непосредственно в БД. Кроме того, вам может потребоваться сериализовать объекты и сохранить их в файловой системе/в виде BLOB в БД, если пространство состояний велико.

4.Hot развертывания: JVM в основном всегда потребуется перезагрузка перезагрузить файлы классов, следовательно, и на стороне сервера Java всегда будет нужно перезапустить. В Ruby/Rails определенные части приложения могут быть горячими. Если вам нужна 100% -ная горячая возможность развертывания, возможно, Эрланг является ответом.

Чтобы улучшить параллелизм, вы также можете использовать архитектуры серверов/приложений с добавлением событий: thin/eventmachine для ruby ​​или apache mina, jboss netty для java.

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