Розподілений ігровий сервер C ++, який використовує базу даних


11

Мій ігровий сервер на основі C ++ (який використовує базу даних) не протистоять поточній середній кількості клієнтів (гравців), тому я хочу розширити його на кілька (більше ніж один) кількість комп'ютерів і баз даних, де всі клієнти все ще залишатимуться в єдиний ігровий світ (сервери повинні спілкуватися один з одним і використовувати декілька баз даних).

Чи є підручники / книги / загальні стандарти, які пояснюють, як це зробити найкращим чином?

Відповіді:


8

Термінологія MMO для "залишатися в межах одного ігрового світу" - це єдиний фрагмент . EVE в Інтернеті - це єдиний великий MMO, який намагається забити кожного гравця в один шматочок.

Пощастило вам, вони опублікували дуже інформативну статтю про те, як вони це роблять.


(джерело: gamasutra.com )

Погані новини. Загалом не можна застосовувати методи EVE в Інтернеті. Їх рішення абсолютно підібрані під конкретний жанр та реалізацію.
ПРИМІТКА . Для всіх надзвичайно привабливих мереж одноосібних мереж EVE онлайн вони використовують одну базу даних. Вони не змогли розробити масштабоване, послідовне рішення з розподілом баз даних в режимі реального часу.

У будь-якому випадку читання того, як вони це зробили, повинно допомогти вам створити власне рішення. Але будьте обережні, ви намагаєтеся вирішити дуже складну проблему.

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

  • Профілюйте свій ігровий сервер.
    • Оптимізуйте код свого сервера, щоб уникнути навантаження на процесор, якщо це проблема.
    • Оптимізуйте протокол зв'язку між клієнтами та сервером, щоб вимкнути мережеву балаканину.
  • Оптимізуйте геймерський сервер для зв'язку з базами даних.
    • запустіть оптимізатор запитів, а потім внесіть зміни, якщо потрібно.
    • скоротити взаємодію з БД до мінімального мінімуму
  • Перемістіть БД на окрему машину.
    Це часто допомагає тоні. Зберігайте БД у тій же локальній мережі, якщо це можливо, але це повинно допомогти вашому ігровому серверу бути набагато веселішим, коли це єдине, що працює на сервері.

Як ви визначаєте "мажор"? Королівство ненависті використовує один осколок. Усі поділяють один і той же кусок Farmville. Star Trek Online і Champions Online обидва використовують одношарові моделі, але з обмеженими зонами.

Замість використання бази даних SQL, ви також можете використовувати рішення noSQL, призначене для кластеризації та шардингу, як MongoDB.
Філіп

1
@JoeWreschnig веб-ігри - це не ігри в режимі реального часу, а набагато простіше ... Я не впевнений, скільки гравців мають Star Trek Online та Champions Online ...
o0 '.

4

Вашим першим кроком має стати роз'єднання прямого доступу до бази даних з ігрового сервера та використання специфічного програмного забезпечення для підготовки даних для вашого сервера (наприклад, XML, JSON). Вони зможуть обробляти будь-яку кількість баз даних і, що ще важливіше, зможуть надати вам певні параметри кешування додатків. Кешуйте все, що можете, і натискайте на db лише тоді, коли потрібно. Робіть великі результати і рідко замість багатьох невеликих запитів, щоб досягти найкращої ефективності у вашому сценарії.

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


1
Це все звучить добре, поки ви не врахуєте, що він сподівається мати декілька серверів, що мають доступ до одного набору даних - це означає, що без подальшої координації кеші на стороні програми вийдуть із синхронізації, що призводить до помилок гри в кращому випадку та втрати даних у гіршому випадку. Я не погоджуюся з тим, що ви сказали, але в оригінальному плакаті потрібно також розглянути питання про узгодженість між сервером, перш ніж продовжувати.
Кілотан

Посереднє програмне забезпечення - це тунель даних, який з одного боку відповідає за кешування даних, а також за надання даних. Однак він лише надає дані серверу (ніколи клієнтові), і сервер кешує всі основні дані, пов'язані з іграми при запуску. Таким чином, у будь-який час може бути підключено багато джерел даних та багато запитувачів даних. MMO, над яким я працюю, використовує цю схему досить ефективно.
Конрад К.

Це не пояснює, як ви взагалі вирішили проблеми узгодженості між сервером. У якийсь момент серверам потрібно синхронізувати дані між собою, або у вас є умови перегонів, які проявляються як випадкові відключення, дублюючі гравці, обдурені предмети, відсутні квести тощо

Дані ніколи не дублюються - у будь-який час лише один сервер відповідає за певний об'єкт, і коли потрібно, він передає цей об'єкт іншому серверу. Об'єкти - це клієнтські з'єднання, які також включають об'єкт управління програвачем. Однак це робиться через головний сервер і обговорюється між серверами. Тож ми маємо справу з двома видами даних - інформацією бази даних (до якої відноситься моя оригінальна публікація) та ігровими об'єктами, які створюються під час виконання та передаються навколо них у мультисерверній mmo. Жоден із них ніколи не повинен потрапляти у стан перегонів або дублюватися на рівні заявки.
Конрад К.

3

Щодо ігрового сервера: Загальна стратегія полягає у використанні декількох серверів, де кожен сервер управляє частиною ігрового світу. Кожному користувачеві зазвичай потрібно лише знати про те, що відбувається навколо нього, тому має сенс розділити світ за місцевістю. Це, на жаль, стає набагато складнішим, якщо у вас відкритий світ без будь-яких кордонів замість світу, який складається із закритих зон та гравців, які телепортуються між ними. Коли у вас відкритий світ, вам потрібен спосіб безперешкодної передачі гравців між зонами та спосіб синхронізації областей біля кордонів між серверами. Це складна проблема.

Щодо бази даних: бази даних SQL зазвичай погано масштабуються. Вони не розроблені для розповсюдження. Але в даний час існує досить нова тенденція баз даних NoSQL, таких як MongoDB або Cassandra, які були розроблені для розподілу на декілька серверів. Вони значно полегшують додавання потужностей, просто додаючи більше серверів. То чому б усі великі ігри не переходити на них? Тому що:

  1. Бази даних SQL існують більше 40 років, а бази даних NoSQL - лише кілька років. Ще не так багато ноу-хау, як їх найефективніше використовувати, і їх розвиток швидко просувається. На ринку є багато конкуруючих і абсолютно несумісних продуктів, і немає ознак, хто з них виживе, а який застаріє і припиниться через кілька років. Більшість великих гравців віддають перевагу відомим недолікам SQL над невідомими ризиками баз даних NoSQL.
  2. Вони працюють дуже по-різному від баз даних SQL і вимагають переосмислити всю вашу стійку стратегію. Це може призвести до кардинальних змін у всій архітектурі програмного забезпечення.

Тож, коли ваш проект вже дуже розвивається, перехід на інше рішення бази даних може бути великим ризиком і дуже великими інвестиціями часу та енергії.


0

Ні. Це неймовірно складна область, яка ще не була вирішена.


Може бути якийсь "шаблон" (не як "С ++ шаблони дизайну) його рішення? Є багато MMORPG.
Слав.

2
Більшість ММО підтримуються абсолютними катастрофами для баз даних.

Зокрема, ММО часто мають дуже різні підходи до їх збереження даних, які часто приємно працюють для їх власного дизайну ігор, але не для інших дизайнів ігор. Оскільки дизайн гри є найважливішою частиною, не можна адекватно вказати стратегію збереження та розповсюдження даних без такої. (Що можна розтлумачити як: "Задайте більш конкретний питання, розкажіть нам, які дані у вас є, як часто вони змінюються і чому ви думаєте, що хочете поширити єдиний світ на декількох серверах.")
Kylotan

0

Я знаю, це старе, але ....

Насправді на цьому потрібно зосередитись дві області.

Потрібно розподілити свою програму на декількох серверах. Потрібно розподілити свою базу даних на декількох серверах.

І вам потрібно мати надмірність для обох.

Для цього є деякі рішення з відкритим кодом. Farmville - хороший приклад використання MemSQL / Couchbase.


1
Розповсюдження бази даних на декількох серверах, безумовно, є вирішеною проблемою. На жаль, це зазвичай не є важливою вимогою до онлайн-ігор, які зводять мінімум доступу до БД. Навпаки, розповсюдження реального геймплея на декількох серверах все ще не є вирішеною проблемою.
Килотан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.