Назад | Перейти на главную страницу

Архитектура динамического игрового сервера

Я пытаюсь найти способ разработать архитектуру игрового сервера для мобильной игры в реальном времени. Дизайн должен быть рентабельным, но все же в некоторой степени масштабируемым (позже, по крайней мере, с минимальными усилиями).

Поток мобильных клиентов:

Подключается к серверу-дистрибьютору, предоставленному DNS LB, и группируется с x игроками. Если достигнуто y игроков, серверу-дистрибьютору необходимо связаться с управляющим сервером, который запускает или использует уже запущенный игровой сервер. Управляющий сервер отправляет обратно IP-адрес и порт на сервер-распределитель, который затем отправляет их сгруппированным игрокам. Затем игроки подключаются к данному игровому серверу. После игры игроки будут отправлены вместе на новый или тот же сервер-дистрибьютор.

Интересно, как реальным сервером (виртуальными машинами) для игровых серверов можно управлять динамически. Я посмотрел на экземпляры AWS EC2, но если у нас есть 500 игроков с 6 игроками в группе, которые играют 6 часов в день, нам потребуется ~ 84 экземпляра EC2 t3.small (2 виртуальных ЦП, 2 ГБ ОЗУ) запущенных. Это будет стоить ~ 1160,00 долларов США в месяц. Думаю, с такой ценой было бы выгодно иметь реальные виртуальные машины, а не динамические облачные экземпляры?

Я также посмотрел на AWS ECS что может быть хорошей уловкой, но я не уверен, как можно управлять игровыми серверами в контейнерах для автоматического масштабирования.

Ссылка на изображение Вот. Извините, изображения могут быть размещены не менее чем с 10 повторениями.

Объяснение компонентов

Распределитель:

Мобильные клиенты будут подключаться к ним, чтобы объединяться с другими игроками. Это похоже на лобби, где игроки будут сидеть, пока не дойдут до X игроков или, например. обратный отсчет закончился.

Сервер управления:

Необходимо позаботиться о запущенном сервере (ВМ) и обработать запросы на запуск игрового сервера от дистрибьюторов.

Игровой сервер:

Является авторитетным серверным клиентом с физикой и т.д. Один игровой сервер (программное обеспечение) для X игроков в группе. Игроки будут подключаться к ним от дистрибьютора после «фазы» лобби.

Вопрос:

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

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

Это может быть полезная архитектура. Обратите внимание на хранение данных. Где хранятся данные? Если в базе данных SQL, как вы это масштабируете?

Чтобы масштабировать игру:

  1. Используйте несколько программных компонентов, игроки разделены на узлы (у вас это есть)
  2. Убедитесь, что хранение данных не является узким местом в одной точке. Например. единая БД SQL. Игровые серверы должны иметь выделенное внутреннее хранилище.
  3. Сделайте сервер управления избыточным. Два экземпляра позади LB, некоторая форма репликации данных между ними.

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

Часть ОС, экземпляры ВМ:

  • AWS может быть дорогим, если серверы действительно что-то делают
  • 2+ выделенных сервера с Proxmox или Docker, вероятно, дешевле, чем AWS в среднесрочной / долгосрочной перспективе
  • или 2+ выделенных сервера, просто запускайте процессы на разных портах, автоматизируйте позже

Пока каждый компонент может масштабироваться независимо от других, все в порядке.

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