2016-01-29 2 views
1

У меня есть игровой сервер, который использует базу данных SQL для хранения/получения данных игрока. Игровой сервер имеет очередь ожидающих запросов/запросов базы данных, чтобы избежать блокировки опроса сетевых потоков. Если игроков слишком много, база данных становится напряженной и начинает замедлять запросы.Состояние базы данных между несколькими приложениями

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

Мне было интересно, есть ли способ управлять этим типом синхронизации между несколькими экземплярами приложения (игровыми серверами).

Я думал о транзакциях, но это все равно может вызвать проблемы, если очередь не будет быстро удалена (запросы, ожидающие ответа на серверную память, а не на сервере базы данных).

Создание «сервера базы данных», в котором все серверы игр соединяются и запрашивают операции с базой данных (таким образом, избегая нескольких очередей), это не вариант.

Предположим, что база данных отлично оптимизирована и решения должны быть выполнены на самом приложении.

Какие у меня варианты?

+0

Вы по существу спрашиваете, как достичь [согласия] (https://en.wikipedia.org/wiki/Consistency_model) в распределенной системе. – user2079303

+0

@ user2079303 любые известные решения? – WoLfulus

+0

Многие, я бы ожидал. Я не изучал его, но это обширный предмет. Как наивное решение, моя первая попытка состояла в том, чтобы хранить временную метку всякий раз, когда данные игрока являются модификаторами. И всякий раз, когда игрок подключается, задайте все базы данных, есть ли у них новая метка времени, и при необходимости синхронизируйте. Это значительно замедляет начальное время соединения, а также синхронизирует часы серверов. – user2079303

ответ

0

Когда игрок подключается, создайте «открытую» запись в базе данных. Когда он отключится, создайте «закрытую» запись.

Когда игрок повторно подключается, не разрешайте создавать новую «открытую» запись, пока все существующие «открытые» записи не будут иметь соответствующую «закрытую» запись.

+0

Если сервер по какой-либо причине или потерял связь с базой данных, учетные записи будут заблокированы. – WoLfulus

+0

Ну, да, я предполагаю, что для того, чтобы играть в игру, нужен рабочий сервер и соединение с базой данных. –

+0

Я подумаю об этом. Все еще чувствует, что есть что-то лучшее, что можно сделать. – WoLfulus

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