Постарайтесь сделать это как можно более простым, чтобы интерфейсы были четко определены и задокументированы. Обслуживание и отладка сложной системы в производстве легко превращается в ад. Поэтому, если есть простой и сложный подход, подумайте дважды, прежде чем переходить к сложному.
Определение услуг
Я думаю, что первым шагом является определение сервисов и их зависимостей : статический контент, аутентификация, локальный чат, глобальные каналы чата, региональные каналы чата, список друзей, гильдии, сумка / инвентарь, аукционный дом, глобальная карта, мир, ...
Затем для каждой из этих служб решено, может ли клиент поговорить с ними напрямую. Например, довольно просто позволить клиенту общаться напрямую с серверами, отвечающими за глобальные каналы чата. Мировые серверы вообще не должны участвовать в сообщениях чата. Региональный чат может быть реализован таким же образом, но мировые серверы должны сообщать серверам чата, когда игроки меняют регионы. Опять же, они не должны заботиться о сообщениях.
Третий шаг - подумать о балансировке нагрузки в сервисе . Например, глобальные и региональные каналы чата могут быть разделены на несколько серверов в зависимости от их имени. Вероятно, неплохо бы не жестко кодировать этот раздел на клиенте, а предоставлять сервис поиска.
Мировые серверы
Самой сложной частью обычно являются мировые серверы , поэтому я начинаю с простого подхода. Вероятно, хорошей идеей будет позволить клиенту напрямую общаться с сервером, ответственным за регион, в котором он находится. Поэтому при входе в систему или при пересечении региона клиенту необходимо сообщить, к какому серверу подключаться.
Простой подход - разделить мир на независимые регионы . Под независимыми регионами я имею в виду, что игрок не может смотреть из одной части в другую, а монстры не могут пересекать части. Эти регионы отличаются от регионов, которые игрок видит в зависимости от ландшафта и истории внешнего мира. Обычно большинство монстров находятся в подземельях, и игроки склонны признать, что им нужно пройти через ворота, чтобы войти в подземелье. Особенно, если эти подземелья создаются для каждой группы игроков. Другими примерами во внешнем мире являются разные континенты и долины, окруженные высокими горами.
Подход непрерывного мира действительно быстро становится сложным, поэтому имеет смысл хорошо его спланировать: какая информация нужна клиенту? Какой информацией должны поделиться серверы? Игрок в основном будет взаимодействовать только с объектами (включая монстров и NPC) в том же регионе. Вы можете обмануть, разместив объекты вне диапазона кликов от границы зоны. Это означает, что клиент больше всего интересуется информацией только для чтения для соседних зон. В этих случаях серверам зон не нужно ничего координировать, за исключением проверки разрешений, что игрок находится достаточно близко, чтобы подключиться к соседней зоне.
Это оставляет лишь очень небольшое количество сложных случаев, когда объекты или действия должны пересекать границу сервера. И это хорошо, потому что такие случаи, как стрелки и заклинания, критичны для производительности. Это может быть хорошей идеей разделить бой на атакующих и обороняющихся. Таким образом, сервер заклинателя будет определять параметры атаки, включая положение заклинателя. Сервер защитника получит сообщение об атаке и рассчитает удар. Серверу злоумышленника не нужно знать о воздействии; клиент узнает об этом, используя свое соединение только для чтения.
В зависимости от того, насколько сложна модель вашего плеера, может потребоваться пара секунд, чтобы перенести ее на другой сервер (у Second Life есть огромная проблема с этим). Эту проблему можно решить, подготовив передачу заранее, когда игрок приблизится к виртуальной границе. Таким образом, большая часть данных игрока уже кэшируется на конечном сервере, когда происходит фактическая передача обслуживания.
Резюме
Разделите проблему, определив различные сервисы, которые могут быть распределены по серверам с небольшими зависимостями. В качестве следующего шага рассмотрим, как выполнить балансировку нагрузки в критически важных сервисах. Делегируйте балансировку работы клиенту, указав ему подключаться напрямую к соответствующим серверам (очевидно, серверы должны проверять разрешения). Сохраняйте это как можно более простым, хорошо документируйте обязанности различных служб и серверов, предоставьте возможность включить отладочный вывод.
PS: некоторые из этих методов могут быть использованы для повышения надежности. И вы должны помнить об этом, потому что использование многих серверов подразумевает гораздо более высокий риск взлома; не только в программном обеспечении, но и на аппаратном уровне.