глюк А, который получает много новых разработчиков, является семантикой исключения переброска.
Партии времени я вижу код как следующий
catch(Exception e)
{
// Do stuff
throw e;
}
, проблема состоит в том, что это вытирает отслеживание стека и делает проблемы диагностирования намного тяжелее, причина, которую Вы не можете отследить где порожденное исключение.
корректный код является любой оператором броска без args:
catch(Exception)
{
throw;
}
Или обертывание исключения в другом и использования внутреннего исключения для получения исходного отслеживания стека:
catch(Exception e)
{
// Do stuff
throw new MySpecialException(e);
}
Чтобы ответить на ваш вопрос, нам нужно понять, нужен ли вам объем или ответ, но получить и то и другое одновременно сложно.
Балансировка нагрузки на уровне 7 - это балансировка на уровне приложений на основе данных, поэтому содержимое данных сетевого пакета необходимо направить в конечную точку. Вы можете достичь объема (большего числа пользователей), реализовав маршрутизацию на уровне приложения, уровня обслуживания или уровня ядра.
Масштабируемость - я предполагаю, что вам не хватает памяти, ресурсов ЦП и пропускной способности сети.
Уровень приложения - логика вашего приложения получает пакет приложения и соответствующим образом маршрутизирует.
Уровень обслуживания - ваша системная структура (какая-то внешняя служба) получает пакет и через модуль - выполняет маршрутизацию (подумайте о настраиваемом модуле apache, даже о модулях сетевого драйвера - например, о написании сетевого фильтра)
Ядро level - выполняет маршрутизацию на уровне сетевых пакетов.
Чем ближе вы приближаетесь к металлу, тем лучше будет ваш ответ. Я предлагаю заранее использовать выделенный Linux-сервер для выполнения маршрутизации - использовать собственный, а не виртуальный. Используйте несколько сетевых адаптеров или совместных сетевых адаптеров для WAN и выделенный адаптер для каждой конечной точки (один + WAN, по одному для каждого подключенного сервера приложений)
Если время ответа важно, тогда вам нужно решение состояния ядра / супервизора, оно будет сэкономит вам несколько переключений контекста, но имейте в виду, что вам нужно ограничить переходы любой ценой и лучше обслуживать меньшее количество, машины большего размера, и ваша масштабируемость всегда будет ограничена. Есть риск использовать KTCPVS, он довольно старый и активно не обновляется. Если вы считаете, что он отлично работает для вас, в противном случае подумайте о том, чтобы написать что-то вроде сетевого фильтра, пока он работает в состоянии системы.
Если громкость важна, но время отклика второстепенно, внедрите специально построенный высокоскоростной переключатель гнезда встроенный в C ++, работающий в состоянии проблемы / пользователя. Его легче всего поддерживать, и он обеспечивает наилучшую масштабируемость.
Вам нужно будет создать несколько прототипов, чтобы выяснить, что лучше всего соответствует вашим потребностям.
Заключительные мысли -
Прежде чем выполнять что-либо из вышеперечисленного, убедитесь, что вы оптимизировали свой игровой дизайн. Возможно, вы знаете большую часть этого, я перечисляю это здесь для всеобщего блага.
(a) сообщения должны удобно помещаться в один сетевой пакет, менее 1500 байт для большинства домашних маршрутизаторов
(b) Постарайтесь уложить логику маршрутизации в игровой клиент, а не на серверы. Простая загрузка клиенту небольшой таблицы с зонами и IP-адресами позволит вам отказаться от всего вышеперечисленного.
(c) Попробуйте ограничить видимость зоны для клиентов, они должны знать о своих зонах и прилегающих зонах только (если вы реализуете пункт b выше)
Надеюсь, это поможет, извините, я не могу быть более конкретным относительно KTCPVS.
Самая большая проблема в подобном случае - это то, что происходит, когда игроки приближаются к границе. Очевидно, им нужно иметь возможность видеть и взаимодействовать друг с другом, но они находятся на разных серверах. Таким образом, вам нужно довольно необычное межсерверное взаимодействие, иногда просто дублирующее сообщения на оба сервера. Это может стать еще более сложным, когда кто-то находится рядом с «углом», и тогда вам приходится иметь дело с 4 серверами!
В книге Разработка многопользовательских игр есть глава «Подводные камни общего сервера» Границы », в котором подробно рассматривается этот вопрос.
Я раньше не слышал о Linux Virtual Server, поэтому не понимаю, как он подходит. Я думаю, что ваше реальное серверное приложение должно поддерживать эту балансировку нагрузки для конкретной игры, вместо того, чтобы пытаться запустить кластер и предполагать, что он автоматически знает, как разделить ваше приложение (чего не будет). На вашем месте я бы написал серверную программу для обработки его собственного участка земли, который должен подключаться к участкам земли вокруг него, а затем разработать протокол межсерверной передачи этих сообщений ("здесь приходит игрок, я собираюсь начать рассказывать вам о нем! »« не забудьте рассказать мне о сообщениях около нашей границы »,« хорошо, игрок находится за пределами моей территории и на вашей, вот его подробные данные »и т. д. . Я думаю, что это немного сложнее, чем просто запустить другой вариант Linux и предположить, что вы получите автоматическую балансировку нагрузки.
Я бы написал серверную программу для обработки своего собственного участка земли, и он должен подключаться к участкам земли вокруг него, а затем разработать межсерверный протокол для передачи этих сообщений («вот идет игрок, я я собираюсь начать рассказывать вам о нем! »« не забудьте рассказать мне о сообщениях около нашей границы »,« хорошо, игрок находится за пределами моей территории и на вашей, вот его подробные данные »и т. д.). Я думаю, что это немного сложнее, чем просто запустить другой вариант Linux и предположить, что вы получите автоматическую балансировку нагрузки. Я бы написал серверную программу для обработки своего собственного участка земли, и он должен подключаться к участкам земли вокруг него, а затем разработать межсерверный протокол для передачи этих сообщений («вот идет игрок, я я собираюсь начать рассказывать вам о нем! »« не забудьте рассказать мне о сообщениях около нашей границы »,« хорошо, игрок находится за пределами моей территории и на вашей, вот его подробные данные »и т. д.). Я думаю, что это немного сложнее, чем просто запустить другой вариант Linux и предположить, что вы получите автоматическую балансировку нагрузки. Почему вы переносите логику распределения на балансировщик нагрузки? Это платный компонент, который может сломаться. Кажется, ваши клиенты хорошо знают, в какой зоне они находятся. Кажется, они вполне могут подключиться к зоне
. Затем вы выполняете балансировку нагрузки на уровне DNS.
Вы не указали узкое место. Сетевой трафик? Дисковый ввод-вывод? Циклы ЦП?
Предполагая, что вы имеете в виду балансировщик нагрузки уровня 7 и не имеете достаточной мощности процессора, я думаю, что LVS не является оптимальным выбором. Я выполнил балансировку нагрузки веб-сервера с помощью LVS, который работает просто и не совсем сложно.
Но я думаю, что для балансировки нагрузки MMORP таким образом требуется значительное количество дополнительного кода в LVS, может быть проще выполнить балансировку нагрузки. с многопоточным приложением, распределенным на каком-то многоядерном сервере. Но это не является полностью масштабируемым, это позволяет получить только 16 ядер без недопустимого увеличения стоимости.