2016-06-05 6 views
0

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

На данный момент данные загружаются из MySQL в переменные на сервере. Например, деньги игрока загружаются в переменную для каждого игрока под названием «Деньги» (выглядит немного так: DATA [playerid] [Деньги]).

Если игрок убивает другого игрока, их переменная DATA [playerid] [Kills] получает приращение. Затем, каждые несколько минут, и когда игрок отключается от сервера (т. Е. Закрывает игру, происходит сбой игры и т. Д.), Запускается запрос на обновление MySQL и просто хранит все из своих переменных в свою строку в таблице «игроков» в базе данных.

Однако, если сервер терпит крах, данные могут быть потеряны, даже если это займет всего несколько минут (игроки могут заработать приличную сумму денег в течение нескольких минут), поэтому я думаю об изменении его, чтобы вместо того, чтобы увеличивать переменную, она просто увеличивает конкретное поле в базе данных. Например, если игрок зарабатывает 100 долларов, запрос на обновление просто добавляет 100 к денежному полю в своей строке в db.

Очевидно, это означает, что если много игроков сражаются, количество убийств, смертей, денег и очков будет заработано, что означает, что на сервер MySQL отправляется множество запросов. Это вызовет проблемы, такие как замедление или сбой? Стоит ли гарантировать, что данные не будут потеряны? Я слышал от кого-то, что Twitter использовал для отправки тысяч запросов на один сервер MySQL.

Я также регистрирую сообщения чата, поэтому каждый раз, когда игрок отправляет сообщение чата, отправляется запрос. Это вызовет проблемы, если, скажем, 2-3 сообщения в секунду?

+0

Если он падает, получите больший сервер БД! Лучше всего, вероятно, поместить данные в кеш памяти, такой как Redis, а затем периодически писать из Redis в MySQL. –

+0

В основном каждое онлайн-игра теряет данные при сбое сервера. Вы не должны быть единственным исключением (предполагая, что это не настоящие деньги). Или ваш сервер часто сбой, что это должно быть проблемой? Это зависит от характеристик вашего сервера, если это вызовет проблемы. И тогда есть способы справиться с этим. Но почему бы вам просто не протестировать свой сервер (и потенциальные способы решения), изменив интервал «каждые несколько минут» на несколько шагов вниз «каждую секунду» (вы можете захотеть добавить маркер изменений, я думаю). Вы даже можете настроить его на текущий счет игрока (больше нагрузки, более высокий интервал). – Solarflare

ответ

0

Я думаю, вам может понадобиться промежуточный шаг: Play-> Partial Save -> Batch Save in DB.
Возможно, это немного для вашего приложения, но вы пробовали думать о «регистрации» вашей частичной информации через брокера данных, like Kafka? Если у вас есть производитель (который записывает данные), сервер kafka автоматически скажет потребителю (который читает данные), где он был перед сбоем.
Or Redis, как предложено в комментариях, хотя это может быть еще более перебор.

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