Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Многосерверная игра


Автор: serghd 29.1.2013, 17:02
Привет всем. Интересует то, каким образом обычно организовывается архитектура клиент-серверного взаимодействия, когда серверов может быть несколько. Как этим серверам сообщаться между собой? К примеру, во время игры игроки совершают разные действия (тратят свои виртуальные деньги, соблюдают правила игры, т.е. накапливают какую-то свою статистику). На каждом сервере, допустим по 2 тыс. игроков, база одна, по мере необходимости можно добавлять дополнительные сервера. Что делать с игровыми_данными/статистикой? Действия игроков сразу же фиксировать в БД? Или хранить всё в рантайме (как-то сообщаясь между серверами), а информацию в БД помещать, например, только тогда, когда игрок делает login/logout? Вобщем интересны мнения, может у кого-то был опыт.

Автор: bsa 29.1.2013, 19:57
чем реже ты вносишь данные в БД, тем меньше на нее нагрузка (тем быстрее работает). Но при этом выше задержки обновления состояний. Поэтому, данные которые не влияют на текущий игровой процесс следует не вносить постоянно в БД.
С другой стороны, можно сделать так, чтобы сервера общались друг с другом и передавали текущую информацию напрямую. Например, игрок, подключенный к серверу1, вступает в бой с двумя другими игроками (сервер2 и сервер3). Эти сервера через установленное подключение производят обмен информацией о текущих координатах игроков и пр. напрямую, минуя БД. Благодаря этому значительно снижается нагрузка на БД за счет распределения на задействованные в баталии сервера.

Автор: serghd 30.1.2013, 00:57
Спасибо, что хоть кто-то выразил мнение=)
Это всё понятно, но вот конкретный пример: допустим, есть игра в покер (клиент-сервер), но надо чтобы сервер был не один, а несколько (но БД, видимо, одна). Как им сообщаться между собой? Если игрок "живёт" на сервере1, то все его действия дублировать на "сервер2" (на случай если упадёт сервер1 к примеру)? А на случай если что-то с сетью, то лучше и на сервер3. Или сами действия не дублировать, но периодически передавать на ведомые серверы только полные состояния главного сервера? В то же время если ляжет сервер1, то главным должен стать какой-то другой, который продолжит раздавать состояния?... Просто покер предполагает создание игровых столов, т.е. стол - это объект, который должен быть создан каким-либо из серверов и передан остальным. Стол меняет своё состояние в зависимости от действий игроков. А есть ещё разные задержки времени во время игры (к примеру, ожидание хода от игрока). Что если сервер упадёт во время такого ожидания? Делать ожидание на каждом из серверов, а вдруг рассинхрон по времени? Моментов много...Интересно как синхронизировать такие сервера. Да и вообще хотелось бы чего-нибудь почитать на эту тему по-подробнее, чтобы делать "как правильно и давно проверено".

Автор: bsa 30.1.2013, 22:54
А может просто забить на состояния? Для игрока в азартные игры главное что? Деньги. Вот их исинхронизируй с БД постоянно. А остальное только в контрольных точках.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)