Как стать автором
Поиск
Написать публикацию
Обновить

Архитектура MMO: источник истины, потоки данных, узкие места I/O и их устранение

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров9K
Всего голосов 36: ↑35 и ↓1+52
Комментарии3

Комментарии 3

Возьмём, например, игру League of Legends. Что бы мы в ней сохраняли и когда? Лично я бы сохранял финальное состояние игры после её завершения (в этом примере мы игнорируем переигрывания, возможность наблюдения и прочее). И причина тому проста. В подобных системах сохранение нам нужно для того, чтобы иметь возможность восстановить их на случай проблем, а не в качестве бизнес-аспекта. Предположим, что мы сохраняем каждое изменение в процессе игры, и наш инстанс взрывается, отключается от сети или поглощается космической бездной. Сможем ли мы восстановиться после этой ошибки? Сможем восстановить последнее сохранённое состояние? Нет, не сможем. Скорее всего, к моменту, когда мы восстановим состояние, половина игроков уже не будут подключены.

Не совсем корректное сравнение.
Для начала League of Legends это не MMO, это MOBA, со всеми выходящими. Типа игра 5 на 5, без какой либо связи с остальными миллионами игроков. А значит что горизонтальное масштабирование тут делается не просто легко а очень легко, и вообще учитывая требования игры к отклику, переход из лобби в игровой режим может даже просчитать координаты игроков и скинуть наилучший для них игровой сервер.

И зачем вы сразу игнорируете переигрывание - то есть самое интересное и сложное?

Да, оно реализовано не для всех, а только для турниров, поскольку требует множества данных для сохранения немедленно, а поскольку принцип MOBA игры заключен в том, что одна партия мало на что влияет в целом (в отличие от ММОРПГ, где, например, при случайной смерти с тебя может выпасть предмет, на который ты потратил полтора года фарма, и если эта смерть из-за рестарта сервера, то явно это проблема).

Также тот момент, что в ЛОЛ существует возможность проиграть реплей, обозначает что игра может записать все ключевые моменты, позволяющие идентично воспроизвести 40-60 минутный матч за счет маленького реплей файла.

Сможем ли мы восстановиться после этой ошибки? Сможем восстановить последнее сохранённое состояние? Нет, не сможем.

Для турнирной игры - да, сможем.

В более сложном случае вроде World of Warcraft мы можем сохранять, например, инвентарь, когда предмет сменяет владельца или используется; позицию персонажа через каждый определённый промежуток времени (возможно, 30 секунд?), новую зону при каждом переходе в неё и так далее.

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

Сложнее шардируется Lineage и ее наследний Aion, где количество персонажей на условную координату может быть несколько тысяч.
Там просто явно идет оптимизация трафика за счет ограниченного оповещения персонажей. например для визуализации действий соседних игроков может сокращаться дальность, или их количество (показывается только первые 100 игроков плюс ты сам), при этом сервер все просчитывает и результат не меняется.

Насчет сохранения в базу - понятно, что прямая работа со списками в памяти быстрее, и сохранять в базу каждый чих сразу - не нужно. Но предполагается что серверная часть запущена надежном устойчивом железе, которое рассчитано на graceful shutdown, с бесперебойником, рейдом и так далее.

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

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

Мне кажется, что было бы полезнее рассматривать реальные подходы, использующиеся в реальных серверах MMO(RPG). Пиратские сервера с исходниками World of Warcraft были доступны уже лет 10 с лишним назад. И вроде неплохо работали при падении сервера. И с обычной MySQL-базой. С тысячами одновременных игроков (10% которых сидели в Даларане).

Я думаю тут основной момент, что автор оригинала работал в среднестатистическом ентерпрайзе, где в коде постоянно выполняются различные запросы в базу
А в геймдеве из базы разок все объекты загружаются в память и работа идет с ними. А в базу сохраняется изредка. И это нормальная практика за все время, что существуют игры.
Задолго до World Of Warcraft и даже Lineage2 (там mssql)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий