Архитектура масштабирования боевой системы
24.09.2024 11:59:58
24.09.2024 11:59:58
- По прежнему одна база данных, поверх нее работают все мелкие рутинные операции (регистрация пользователя, логин, покупки в магазине, одевание в казарме и т.п.). Для таких операций текущей базы хватит за глаза. А если не хватит - это будет означать тысячи игроков одновременно, что будет отличной проблемой. В таком случае можно будет просто развернуть еще один инстанс всего и раскидать игроков по разным серверам.
- Бои должны считаться в памяти и только результат боя записываться в базу. Здесь при относительно низком онлайне можно сохранять состояние боя на конец раунда или раз в минуту например, но в целом даже при полной работе боя от начала до конца в случае выхода из строя узла, на котором бой будет считаться, худшее, что мы получим - это ситуацию как будто бы боя и не было вовсе. Не очень приятный сценарий, но совсем не критичный, особенно учитывая его редкость. Кстати при разработке пустошей я сразу пошел в эту сторону - там все состояние хранится и обсчитывается в памяти, а в базу сохраняется раз в 10 секунд. Поэтому при перезапуске сервера игрок потеряет максимум 10 последних секунд своих действий.
- Работа с боями должна быть вынесена в отдельный сервис, который можно будет деплоить в неограниченных количествах на неограниченном кол-ве железа. В идеале завернуть в контейнер и иметь возможность автоматически скалироваться в облако по необходимости. Работать будет просто: стартуем на нем бой с определенными параметрами (игроки, поле и т.п.), сервис у себя в памяти создает независимый объект боя, внутри которого находится поле, игроки и все остальное. Нужен еще бой? Создаем новый независимый объект и внутри него все дополнительные структуры. При завершении боя дампим результат в базу и чистим память. Такой подход полностью исключит все блокировки между боями, останутся только запросы от игроков внутри одного боя, но это уже проблема совсем другого порядка, на практике можно сказать и не проблема вовсе.
Такая архитектура полностью решит вопрос скалируемости боевой системы. В спокойном режиме работаем на одном сервере, в случае взрывного роста - автоматически поднимаем контейнер в облачном кластере и отдаем задачи расчета боев туда. Растем еще сильнее? Добавляем еще ноды и скалируемся туда. При падении нагрузки убиваем ненужные контейнеры и снова сидим на одном сервере.
Есть только один ньюанс... тут тонна работы.



Icecream
