База, сохранение данных

В начале, было решено сохранять и загружать все объекты и их текущие состояния: игроков, лабиринты, магазины.

1. Сейчас решено сделать загружаемыми из базы при запуске сервера, только игроков и сейчас я объясню почему.
Допустим, завис сервер (ну или неожиданно перегрузился) – да в таком случае будут утеряны все текущие игры в лабиринтах. Но данная ситуация довольно редкая (у многих мне подконтрольных серверов аптайм (количество времени прошедшего с запуска) более года.
А для специальных апдейтах игрового сервера – будем дожидаться окончания любых перемещений по лабиринту – ну или принудительное «выдергивание».

2. Сохранение в базу – асинхронное. Рассмотрим на примере ситуацию, когда используется синхронное сохранение в базу. При изменение данных в происходит, хоть и не существенная, но задержка да и у некоторых типах СУБД может возникнуть dead lock – взаимная блокировка двух процессов. В нашем случае при изменении чего-либо, создается временный лог файл (его имя текущий timestamp), в который записываем изменения. Раз в минуту запускается специальная нить, которая сканирует папку логов и выполняет запись уже в базу, т.к. нить одна то блокировок не будет, а т.к. ее можно запустить с низким приоритетом – то и особых нагрузок, она не вызовет. В случае успеха файлик удаляется, в случае неудачи – записываться в специальный лог об ошибках. Так как актуальные данные хранятся в памяти – никаких сложностей, даже при ошибках не должно возникать.

Собственно текста больше, чем кода :)