Используя Виртуальный сервер Linux для выравнивания нагрузки зон в игре MMO

Повторно выдавая исключения

глюк А, который получает много новых разработчиков, является семантикой исключения переброска.

Партии времени я вижу код как следующий

catch(Exception e) 
{
   // Do stuff 
   throw e; 
}

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

корректный код является любой оператором броска без args:

catch(Exception)
{
    throw;
}

Или обертывание исключения в другом и использования внутреннего исключения для получения исходного отслеживания стека:

catch(Exception e) 
{
   // Do stuff 
   throw new MySpecialException(e); 
}
5
задан Amro 2 July 2012 в 11:11
поделиться

4 ответа

Чтобы ответить на ваш вопрос, нам нужно понять, нужен ли вам объем или ответ, но получить и то и другое одновременно сложно.

Балансировка нагрузки на уровне 7 - это балансировка на уровне приложений на основе данных, поэтому содержимое данных сетевого пакета необходимо направить в конечную точку. Вы можете достичь объема (большего числа пользователей), реализовав маршрутизацию на уровне приложения, уровня обслуживания или уровня ядра.

Масштабируемость - я предполагаю, что вам не хватает памяти, ресурсов ЦП и пропускной способности сети.

  • Уровень приложения - логика вашего приложения получает пакет приложения и соответствующим образом маршрутизирует.

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

  • Ядро level - выполняет маршрутизацию на уровне сетевых пакетов.

Чем ближе вы приближаетесь к металлу, тем лучше будет ваш ответ. Я предлагаю заранее использовать выделенный Linux-сервер для выполнения маршрутизации - использовать собственный, а не виртуальный. Используйте несколько сетевых адаптеров или совместных сетевых адаптеров для WAN и выделенный адаптер для каждой конечной точки (один + WAN, по одному для каждого подключенного сервера приложений)

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

Если громкость важна, но время отклика второстепенно, внедрите специально построенный высокоскоростной переключатель гнезда встроенный в C ++, работающий в состоянии проблемы / пользователя. Его легче всего поддерживать, и он обеспечивает наилучшую масштабируемость.

Вам нужно будет создать несколько прототипов, чтобы выяснить, что лучше всего соответствует вашим потребностям.

Заключительные мысли -

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

(a) сообщения должны удобно помещаться в один сетевой пакет, менее 1500 байт для большинства домашних маршрутизаторов

(b) Постарайтесь уложить логику маршрутизации в игровой клиент, а не на серверы. Простая загрузка клиенту небольшой таблицы с зонами и IP-адресами позволит вам отказаться от всего вышеперечисленного.

(c) Попробуйте ограничить видимость зоны для клиентов, они должны знать о своих зонах и прилегающих зонах только (если вы реализуете пункт b выше)

Надеюсь, это поможет, извините, я не могу быть более конкретным относительно KTCPVS.

10
ответ дан 13 December 2019 в 19:32
поделиться

Самая большая проблема в подобном случае - это то, что происходит, когда игроки приближаются к границе. Очевидно, им нужно иметь возможность видеть и взаимодействовать друг с другом, но они находятся на разных серверах. Таким образом, вам нужно довольно необычное межсерверное взаимодействие, иногда просто дублирующее сообщения на оба сервера. Это может стать еще более сложным, когда кто-то находится рядом с «углом», и тогда вам приходится иметь дело с 4 серверами!

В книге Разработка многопользовательских игр есть глава «Подводные камни общего сервера» Границы », в котором подробно рассматривается этот вопрос.

Я раньше не слышал о Linux Virtual Server, поэтому не понимаю, как он подходит. Я думаю, что ваше реальное серверное приложение должно поддерживать эту балансировку нагрузки для конкретной игры, вместо того, чтобы пытаться запустить кластер и предполагать, что он автоматически знает, как разделить ваше приложение (чего не будет). На вашем месте я бы написал серверную программу для обработки его собственного участка земли, который должен подключаться к участкам земли вокруг него, а затем разработать протокол межсерверной передачи этих сообщений ("здесь приходит игрок, я собираюсь начать рассказывать вам о нем! »« не забудьте рассказать мне о сообщениях около нашей границы »,« хорошо, игрок находится за пределами моей территории и на вашей, вот его подробные данные »и т. д. . Я думаю, что это немного сложнее, чем просто запустить другой вариант Linux и предположить, что вы получите автоматическую балансировку нагрузки.

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

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

0
ответ дан 13 December 2019 в 19:32
поделиться

Почему вы переносите логику распределения на балансировщик нагрузки? Это платный компонент, который может сломаться. Кажется, ваши клиенты хорошо знают, в какой зоне они находятся. Кажется, они вполне могут подключиться к зоне .example.com . Затем вы выполняете балансировку нагрузки на уровне DNS.

-1
ответ дан 13 December 2019 в 19:32
поделиться

Вы не указали узкое место. Сетевой трафик? Дисковый ввод-вывод? Циклы ЦП?

Предполагая, что вы имеете в виду балансировщик нагрузки уровня 7 и не имеете достаточной мощности процессора, я думаю, что LVS не является оптимальным выбором. Я выполнил балансировку нагрузки веб-сервера с помощью LVS, который работает просто и не совсем сложно.

Но я думаю, что для балансировки нагрузки MMORP таким образом требуется значительное количество дополнительного кода в LVS, может быть проще выполнить балансировку нагрузки. с многопоточным приложением, распределенным на каком-то многоядерном сервере. Но это не является полностью масштабируемым, это позволяет получить только 16 ядер без недопустимого увеличения стоимости.

2
ответ дан 13 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: