Разница между игровым сервером и веб-сервером

задняя часть
Разница между игровым сервером и веб-сервером

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

PS: Это только пример мобильных игр SLG.

1. Особенности языка Go

По сравнению с другими языками, такими как Java, Go — очень молодой язык. Язык Go был разработан в Google в 2007 году Робертом Гриземером, Робом Пайком и Кеном Томпсоном. и официально выпущен в 2009 году.

Философия дизайна языка Go вращается вокруг слова простота, что меньше значит больше. Если вы знакомы с Java, вы можете отчетливо испытать это чувство, сравнив его с набором синтаксических именований Go.

Характеристики Go можно просто свести к следующим пунктам.

1.1 Статические и скомпилированные типы

Прежде всего, Go является статическим типом, статический тип означает, что тип каждой переменной известен во время компиляции, благодаря чему многие проблемы могут быть обнаружены на этапе компиляции. А с динамическими языками, такими как JavaScript, некоторые проблемы не обнаруживаются до выполнения.

Go — компилируемый язык, и когда вы видите компилируемый язык, вы можете подумать о другой интерпретации слова. Разницу между ними можно увидеть из буквального понимания, я использую простой пример для сравнения.

  • Тип компиляции Идти в ресторан покушать, после заказа ресторан будет ждать пока все блюда будут готовы перед подачей
  • Объяснительный тип: пойти в ресторан поесть, после заказа съесть по очереди
1.2 Кроссплатформенность

Как следует из названия, написанный вами исходный код Go будет работать на всех системах.

На самом деле это легко понять, например, лозунг Java: «Напиши один раз, работай везде». Все мы знаем, что Java — это компилируемый язык, но когда Java компилируется, он генерирует байт-код, который не имеет ничего общего с текущей операционной системой или процессором.

Этот байт-код должен полагаться на виртуальную машину Java для запуска, что маскирует различия между операционной системой и ЦП от пользователя. Для программистов этот процесс фактически незаметен. Для Java кроссплатформенность самого языка не означает, что код может быть кроссплатформенным.

Кроссплатформенность Go В некотором смысле, как и в случае с Java, нам нужно установить версию Go, которая соответствует текущей операционной системе. Скомпилированный исполняемый файл зависит от операционной системы.

1.3 Автоматическая сборка мусора

Как и JVM, управление оперативной памятью (GC) в Go управляется самим языком Go, что не требует участия программиста, но мы можем вмешаться.

1.4 Собственное параллельное программирование

Что родное? Все мы знаем, что если вы хотите добиться параллелизма в Java, вам нужна поддержка внешней библиотеки классов (Thread), а Go не нужно вводить какие-либо зависимости извне. Поддерживает использование ключевых словgoВот и все. А Java общается через разделяемую память.Те, кто знаком с Go, должны были прочитать предложение «Не общайтесь через разделяемую память, а делитесь памятью через общение».

1.5 идеальный инструмент сборки

Процессы загрузки, компиляции, тестирования, установки, запуска и анализа имеют свои собственные встроенные инструменты. Например, чтобы получить вы можете использоватьgo getкоманда для загрузки и обновления указанных пакетов кода, а для их компиляции и установки вы можете использоватьgo buildСкомпилируйте исходный код с помощьюgo runкоманда для запуска программы Go сgo fmtДля быстрого форматирования кода и унификации стиля кода.

1.6 Мультипарадигмальное программирование

Текущие основные парадигмы программирования — это императивное программирование, функциональное программирование и объектно-ориентированное программирование, с которыми мы наиболее знакомы. При написании кода Go мы можем использовать объектно-ориентированные методы или использовать идеи функционального программирования, чтобы комбинировать и дополнять друг друга.

Например, в Go вы также можете использовать интерфейсы для описания поведения, а также можете использовать чистые функции, чтобы избежать побочных эффектов. Следовательно, мультипарадигмальное программирование означает, что язык поддерживает несколько парадигм программирования.

1.7 Сильный и единый стиль кода

Используйте встроенные инструменты Gogo fmtВы можете быстро преобразовать код в официальный единый стандарт, чтобы достичь цели унификации стиля кода. Вы даже можете использовать golangci-lint, чтобы определить, конфликтует ли ваша грамматика со встроенной стандартной грамматикой.Вы можете подключить этот инструмент обнаружения к хуку git, чтобы добиться унификации стиля кода.

1.8 Активное сообщество

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

2. Преимущества использования Go

Позвольте мне сначала рассказать о моих взглядах на язык Go.Я думаю, что Go имеет большое преимущество в серверной области. Если в будущем появятся сценарии приложений с высоким параллелизмом, то есть большая вероятность, что этот сервис написан на Go. Я не знаю, заметили ли вы, что закон Мура не работает. За последнее десятилетие необработанная вычислительная мощность оборудования не сильно улучшилась. Очевидно, что слепое увеличение количества транзисторов — не лучший способ решения проблемы.

Статья, недавно опубликованная НАСА на официальном сайте, а затем быстро удаленная, показала, что Google, возможно, достиг квантового превосходства, а это означает, что его вычислительная мощность превосходит все традиционные компьютеры. А установка большего количества транзисторов становится дороже, поэтому производители теперь добавляют в процессоры больше ядер для повышения производительности.

Как и в знакомой Java, хотя сама Java поддерживает многопоточность, использование многопоточного программного кода на Java обходится относительно дорого. Создание нового потока в Java занимает около 1 МБ памяти. Если вам действительно нужно поддерживать запуск тысяч потоков, то служба, вероятно, работает под управлением OOM. В дополнение к потреблению памяти также будут проблемы, такие как параллелизм и взаимоблокировка, вызванные поддержкой многопоточности.

В Go вместо потоков используются сопрограммы. А сопрограмма потребляет в разы меньше памяти, чем поток. С теми же ограничениями по физическому устройству вы можете запускать только несколько тысяч потоков, в то время как сопрограммы могут запускать миллионы. И разные Горутины могут безопасно общаться через каналы.

3. Отличие игрового сервера от веб-сервера

В некоторых знакомствах с игровыми серверами может быть сказано, что игровой сервер — это программа, которую нужно долго запускать, а потом как. Лично я считаю, что веб-сервер должен работать долго, а также отвечать на запросы пользователей в неопределенное время. С макроскопической точки зрения между ними нет существенной разницы. В то же время к веб-серверу также предъявляются требования по стабильности и производительности.Игровой сервер обычно делится на большие и малые серверы.В качестве примера мы возьмем маленький сервер.

3.1 Статус

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

Другими словами, будет окно несоответствия данных между собственными данными игрового сервера и данными в базе данных во время работы. Если игровой сервер в это время не работает, это вызовет несоответствие между данными памяти, в которые данные поступают первыми, и данными в инвентаре данных.

У веб-сервера такой проблемы нет, будут реализованы все данные состояния веба, а транзакции могут быть добавлены к операциям, поэтому не нужно беспокоиться о внесении грязных данных из-за сбоев операций. Из-за ограничений состояния игровой сервер будет очень осторожно использовать память и ЦП. Чтобы максимально увеличить пропускную способность и уменьшить задержку обслуживания в случае ограниченных ресурсов. Конечно, веб-сервер сделает соответствующие оптимизации, чтобы уменьшить время отклика интерфейса.

3.2 Расширение

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

Но трудно быть таким же гибким, как веб, на стороне игрового сервера. Во-первых, поток данных — это не база данных, а память.

Чтобы привести очень простой пример, главный город игрока был атакован и подожжен.Если есть автоматическое расширение, очень вероятно, что в окне приземления игрок снова запросит и запросит другой экземпляр. Главный город больше не горит. Потому что данные сначала будут храниться в памяти.

Другой пример: игрок Krypton Gold купил подарочный набор. Затем выйдите из игры и снова войдите в сеть в посадочном окне. Это не простая проблема с данными.Игроки тратят реальные деньги на покупку реквизита, и вдруг их нет.С одним-двумя легко справиться.Если такие проблемы у нескольких игроков,то это серьезная проблема.Попал в аварию. Объем работы по восстановлению данных очень велик.

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

3.3 Стабильность

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

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

Для игровых серверов перезапуск сервера влияет на всех игроков на сервере. Игроки даже не могут войти в игру в период приостановки сервера, что особенно влияет на опыт игрока. Более того, если есть проблема с посадкой данных на сервер до остановки службы, данные будут загружены из базы данных в память после перезапуска службы, что также приведет к несогласованности данных.

3.4 Производительность

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

Однако в Интернете, если объем трафика велик, один сервис не может выдержать нагрузки.Первое решение, о котором думает большинство людей, должно состоять в создании нескольких экземпляров.В конце концов, его можно легко масштабировать по горизонтали.

На игровом сервере ресурсы сервера будут считаться весьма ценными. Например, поле, которое не может быть выгружено, никогда не должно быть выгружено.Значение поля может быть рассчитано по известным условиям, поэтому старайтесь не определять его в коде. Однако это также зависит от конкретной ситуации, чтобы взвесить объем работы и частоту вызовов. Потому что после подключения к Интернету, если вы столкнетесь с несоответствиями данных, чем меньше данных вы храните, тем легче восстановить данные.

3.5 Строгий

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

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

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

Для Интернета не менее важна стабильность сервера. В противном случае, в зависимости от бизнеса, тяжесть последствий также может быть разной. Влияние на пользовательский опыт напрямую повлияет на репутацию продукта.

3.6 Формат передачи данных

Любой, кто знаком с Интернетом, знает, что формат передачи данных — JSON. А в игровом сервере есть Protobuf — формат передачи данных, разработанный Google, похожий на JSON. Protobuf является двоичным, и объем двоичных данных будет меньше, чем JSON. Кроме того, если переданное поле пустое, оно не будет передано. И если JSON пустой, будет передано то же самое.

Protobuf работает лучше, чем JSON, в любой среде, например Node.js и Java. В Java Protobuf даже почти на 80% быстрее, чем JSON. Если при обмене данными между службами Java есть узкое место в производительности, вы можете рассмотреть возможность использования RPC для связи между службами.

Но у всего есть две стороны. Недостатки Protobuf остаются:

  • меньше документации
  • Сообщество против JSON
  • Не так читаем, как JSON

4 Резюме

Вышеупомянутая разница между двумя суммами за последние два месяца. Это просто общее сравнение, без каких-либо подробностей. Детали могут быть представлены отдельно в будущем.

Прошлые статьи:

Связанный:

  • Официальная учетная запись WeChat: заметки о полном стеке SH (или прямой поиск WeChat LunhaoHu в интерфейсе добавления официальной учетной записи)