Мне просто было интересно, какой язык будет хорошим выбором для разработки игрового сервера для поддержки большого (тысяч) количества пользователей? Я баловался python, но понял, что это было бы слишком много проблем, поскольку он не порождает потоки по ядрам (что означает, что 8-ядерный сервер = 1-ядерный сервер). Мне также не очень понравился язык (это «я» меня возмутило).
Я знаю, что C++ - это язык для работы с точки зрения производительности, но я его ненавижу. Я не хочу иметь дело с его неаккуратным синтаксисом, и мне нравится, когда меня держат за руку управляемые языки. Это подводит меня к C# и Java, но я открыт для других языков. Мне нравится простота .NET, но мне было интересно, будет ли это хорошо для работы с точки зрения скорости. Имейте в виду, поскольку он будет развернут на сервере Linux, он будет работать на платформе Mono - не уверен, имеет ли это значение. Я знаю, что синтаксис Java очень похож на .Net, но мой опыт работы с ним ограничен. Существуют ли какие-то рамки для этого или есть какие-то вещи, которые упростят разработку?
Пожалуйста, помогите мне и моей придирчивой личности прийти к решению.
ОБНОВЛЕНИЕ: я не хотел показаться таким придирчивым, и я действительно так не думаю. Единственным языком, который я действительно исключил, был C++, Python, который мне не нравится из-за проблемы с масштабируемостью. Я знаю, что существуют способы связи между процессами, но если у меня 8-ядерный сервер, зачем мне создавать 8 процессов? Есть ли более элегантное решение?





Ненавижу это говорить, и я знаю, что рискую здесь потерпеть неудачу, но это не похоже на то, что для вас есть язык. У всех языков программирования есть свои особенности, и программистам просто необходимо к ним адаптироваться. Вполне возможно написать рабочий сервер на Python без классов (исключив ссылки на классы переменных «self»), и точно так же легко написать C++ с чистым синтаксисом.
Если вы хотите развернуть кроссплатформенный продукт и хотите также разрабатывать кросс-платформенный, лучшим вариантом, вероятно, будет Java. Это более короткие циклы разработки, чем транслируемые языки, как C и C++, но более высокая производительность (спорна, но я всегда был против Java = P), чем интерпретируемые языков, таких как Python и Perl, и вы не должны работать с неофициальными реализациями, как Mono, который время от времени может поддерживать не все функции языка.
Это может во многом зависеть от того, на каком языке лучше всего выражается ваша «игровая логика» (вы можете знать этот термин как «бизнес-логика»). Например, если игровая логика лучше всего выражается на Python (или на любом другом конкретном языке), она Возможно, лучше всего просто написать его на Python и жестко решить проблемы с производительностью с помощью многопоточности или кластеризации. Несмотря на то, что вам может потребоваться много времени, чтобы получить желаемую производительность от Python, оно будет меньше, чем время, которое потребуется вам, чтобы выразить "игрок A теперь накладывает заклинание тьмы 70 уровня в радиусе 7 единиц воздействия. все юниты, которые разговаривали с игроком B и .... "на C++.
Еще нужно учесть, какой протокол вы будете использовать для связи с клиентами. Если у вас сложный двоичный протокол, C++ может быть проще (особенно, если у вас уже был опыт этого раньше), тогда как JSON (или аналогичный) может быть проще для синтаксического анализа в Python. Да, я знаю, что C++ и python не являются языками, которыми вы ограничены (или даже рассматриваете), но я обычно ссылаюсь на них здесь.
Вероятно, все сводится к тому, на каком языке вы лучше всего владеете. Плохо написанная программа, которую вы ненавидите писать, будет хуже, чем программа, написанная на языке, который вы знаете и любите, даже если плохо написанная программа была на более мощном языке.
Какая производительность вам нужна?
twisted отлично подходит для серверов, которым требуется много параллелизма, как и erlang. Любой из них легко поддерживает массовый параллелизм и имеет средства для распределенных вычислений.
Если вы хотите охватить более одного ядра в приложении Python, сделайте то же самое, что и если бы вы хотели охватить более одной машины - запустите более одного процесса.
Говоря о чистой производительности, если вы можете запустить Java 6, вы получите производительность примерно 1: 1 по сравнению с оптимизированным C++ (несмотря на особые случаи, иногда Java быстрее, иногда C++), единственная проблема, с которой вы столкнетесь, это, конечно, такие вещи, как библиотеки баз данных. , взаимосвязь, масштабируемость и т. д. Я считаю, что для каждой из этих проблем доступно множество хороших и отличных решений, но вы не найдете ни одного языка, который бы решил все за вас, поэтому я должен дать вам давний совет: выберите язык, который вам нравится, и используйте его. .
О, вы все еще это читаете? :) Что ж, вот еще несколько дополнительных указателей.
Они устранили некоторые из своих сетевых узких мест с помощью нового сетевого уровня ("Stackless I / O"), но их проблемы с масштабируемостью все еще сохраняются, потому что у них нет какой-либо динамической балансировки нагрузки (они не могут переместить загруженную солнечную систему на другой сервер без "перезагружая" его).
Самый большой вклад в отставание в EVE afaik происходит из-за их плохого выбора архитектуры базы данных (один SQL-сервер и несколько SOL, чрезвычайно высокая пропускная способность), а также из-за интересного использования Python в неправильных местах, так что да, вы правы, что в основном это архитектурная проблема.
@Esko AFAIK сервер БД мало используется в боевых действиях флота. У них есть> 5000 солнечных систем, назначенных на 250-300 процессоров / «узлов», и любое количество сражений может вспыхнуть в разных солнечных системах на одном и том же узле в любое время, что также может быть связано с загруженным центром миссии. Нет балансировки нагрузки = плохо.
С.Лотт: Я бы предпочел получать очки не за упоминание EVE, а за фактическое содержание моего поста. mjy: Знаете ли вы, что каждый системный узел на самом деле является единственным клиентом EVE, работающим в режиме сервера? Вот почему они не могут правильно сбалансировать их нагрузку. Неудачный выбор дизайна.
Вы также можете посмотреть jRuby. Он содержит множество преимуществ Java и множество преимуществ Ruby в одном удобном пакете. У вас будет доступ к огромным библиотекам на обоих языках.
Вы также можете использовать Java и скомпилировать код с помощью GCC в собственный исполняемый файл.
Таким образом, вы не получите снижения производительности механизма байт-кода (да, я знаю - Java из коробки работает так же быстро, как C++. Должно быть, только я всегда измеряю разницу в производительности в 5 раз). Недостатком является то, что Java-интерфейс GCC не поддерживает все функции языка Java 1.6.
Другой вариант - использовать выбранный вами язык, сначала заставить код работать, а затем перенести важные для производительности элементы в собственный код. Практически все языки поддерживают привязку к скомпилированным библиотекам.
Это не решает вашу проблему «Python не поддерживает многопоточность», но дает вам больше возможностей выбора.
Erlang - это язык, который разработан для параллелизма и распределения по нескольким серверам, что идеально подходит для серверного программного обеспечения. Несколько ссылок об Erlang и игровых серверах:
http://www.devmaster.net/articles/mmo-scalable-server/
http://www.erlang-consulting.com/euc2005/mmog/mmog_in_erlang.htm
Я сам подумываю написать игровой сервер на Erlang.
Более подробная информация об этом игровом сервере может помочь людям лучше ответить на ваш вопрос. Является ли это игровым сервером в смысле чего-то вроде выделенного сервера Counter Strike, который находится в фоновом режиме и поддерживает многопользовательские взаимодействия, или вы пишете что-то, что будет размещено на веб-сервере HTTP?
Лично я бы подумал о Java или C++. Мои личные предпочтения и набор навыков, вероятно, привели бы меня к C++, потому что я считаю Java неуклюжей для работы на обеих платформах (особенно на Linux) и не уверен, что C# еще готов к использованию в Linux.
Тем не менее, вам также необходимо иметь довольно значительное сообщество, работающее над указанным сервером, прежде чем производительность вашего языка станет настолько проблематичной. Я бы посоветовал написать ее на любом языке, который вы можете использовать в данный момент, и если ваша игра вырастет до достаточного размера, инвестируйте в ее переписывание в это время.
Очевидные кандидаты - Java и Erlang:
Pro Java:
Pro Erlang:
Contra Erlang:
Если ваш игровой сервер в основном работает как диспетчер событий (с небольшой заправленной базой данных), парадигма Erlang, управляемая сообщениями, должна подойти.
В наши дни я бы не стал рассматривать использование неуправляемого языка (например, C или C++); незначительные преимущества в производительности просто не стоят хлопот.
Каковы ваши цели? Не создание самой игры, а зачем вы ее создаете?
Если вы делаете это, чтобы выучить новый язык, выберите тот, который кажется вам наиболее интересным (то есть тот, который вы хотите выучить больше всего).
Если это по какой-либо другой причине, то лучшим языком будет тот, который вы уже знаете лучше всего и которым больше всего нравится пользоваться. Это позволит вам сосредоточиться на разработке логики игры и наладить что-то и запустить, чтобы вы могли видеть прогресс и сохранять мотивацию для продолжения, вместо того, чтобы увязать в деталях используемого вами языка и терять интерес.
Если ваш любимый язык окажется в чем-то неадекватным (слишком медленным, недостаточно выразительным и т. д.), Тогда вы можете переписать проблемные разделы на более подходящем языке, когда возникнут проблемы, - и вы не будете знать лучший язык для решения конкретных проблемы, пока вы не узнаете, в чем заключаются проблемы. Даже если выбранный вами язык окажется совершенно непригодным для конечного производственного использования и все это придется переписать, он предоставит вам рабочий прототип с проверенной игровой логикой, что значительно упростит работу с новым языком.
Вы можете взглянуть на Безстековый Python. Это альтернативный интерпретатор Python, который обеспечивает большую поддержку параллелизма. И серверное, и клиентское программное обеспечение EVE Online используют Stackless Python.
Отказ от ответственности: я сам не использовал Stackless Python широко, поэтому не могу предоставить какие-либо отчеты о его эффективности из первых рук.
Я могу немного отклониться от темы здесь, но эта тема меня интересует, поскольку я (в смысле хобби) работал на довольно многих игровых серверах (серверах MMORPG) - над чужим кодом, а также над моим. Есть литература, которая будет вам интересна, напишите мне, если вам нужны ссылки.
Одна вещь, которая поражает меня в вашем вопросе, - это желание обслуживать тысячу пользователей с помощью многопоточного приложения. По моему скромному опыту, это не работает. :-)
Когда вы обслуживаете тысячи пользователей, вам нужен максимально модульный дизайн, потому что одной из ваших основных целей будет поддержание работоспособности сервиса в целом. Игровые серверы, как правило, довольно сложные, поэтому будет немало серьезных ошибок. Не делайте свою жизнь несчастной из-за единственной точки отказа (одного приложения!).
Вместо этого попробуйте создать несколько процессов, которые могут работать на множестве хостов. Мое скромное предложение заключается в следующем:
Я портировал несколько таких движков, написанных на C++ и C#, для хостов, работающих на Linux, FreeBSD, а также на Solaris (на старом UltraSparc IIi - да, моно все еще там работает :). По моему опыту, C# достаточно быстр, учитывая, на каком древнем оборудовании он работает на этой sparc-машине.
Промышленность (насколько мне известно) имеет тенденцию использовать много C++ для обслуживающей работы и встраивает языки сценариев для реальной игровой логики. Ах, уже слишком много написано - прикольная тема.
C++ и Java довольно медленны по сравнению с C. Язык должен быть инструментом, а не костылем.
В разработке есть довольно крутой фреймворк, который удовлетворяет все ваши потребности:
Проект Darkstar от вс. Поэтому я бы сказал, что Java - хороший язык для разработки игровых серверов :-)
Я знаю, что facebook использует комбинацию Erlang и C++ для своего механизма чата.
Что бы вы ни решили, если вы выберете комбинацию языков, ознакомьтесь с экономичной структурой facebook для развертывания межъязыковых сервисов. Они открыли исходный код около года назад:
Хотя я еще не пробовал, EVE недавно сделала серьезное переписывание, которое, по их словам, значительно улучшило производительность. Это наводит на мысль, что проблемы с задержкой были связаны с их архитектурой, а не с выбором языка. И каждый язык медленный с плохой архитектурой.