Проект расширяет существующий игровой сервер на C++ возможностью надёжного сохранения состояния, что способствует долговременной работе и повышает отказоустойчивость.
Сервер теперь может сохранять всё своё состояние (динамические объекты, токены игроков и т.д.) в файл и восстанавливать его при запуске, обеспечивая непрерывность работы между перезапусками.
Реализация использует Boost.Serialization для удобной сериализации объектов и интегрируется с существующей обработкой сигналов и игровыми часами сервера.
- C++20
- CMake 3.11
- Boost 1.78.0
git clone https://github.com/Rinalii/serializing-state.git
cd serializing-state/solution
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .
bin/game_server -c ../data/config.json -w ../static/ -t <tick-period> --st <state-file> --sv <save-state-period>
- --state-file <путь> – задаёт файл для сохранения/загрузки состояния игры.
- --save-state-period <мс> – устанавливает интервал (в игровом времени) для автоматического создания снимков состояния.
- При получении сигналов SIGINT или SIGTERM сервер автоматически сохраняет текущее состояние в указанный файл.
- Синхронизированы с игровыми часами (ручные запросы /api/v1/game/tick или автоматические тики, если задан параметр --tick-period).
- Сохранение происходит только тогда, когда с момента последнего сохранения прошло не меньше указанного периода.
- Если указан --state-file и файл существует – состояние загружается, и игра продолжается с этого момента.
- Если файл не существует – сервер стартует «с чистого листа» и создаст файл при завершении или периодическом сохранении.
- Если файл повреждён или содержит некорректные данные – сервер логирует ошибку и завершается с EXIT_FAILURE.
- Если параметр --state-file не указан – сервер работает без сохранения состояния.
- Все динамические объекты на всех картах: собаки и потерянные предметы.
- Все токены и соответствующие идентификаторы пользователей вошедших в игру игроков.
- При завершении работы и при периодических тиках создаётся снимок состояния.
- Снимок сначала записывается во временный файл, затем переименовывается в целевой – это позволяет избежать повреждения данных.
- Если --state-file указан и файл существует, сервер пытается загрузить его
- Исключения во время загрузки перехватываются и логируются