Формат журналу ігор для серверів MMO


12

Журнал ігрових подій (на відміну від журналів помилок / налагодження) для цілого кластера / фрагмента дуже корисний для комерційного ММО, який знаходиться в реальному виробничому середовищі, забезпечує життєву підтримку обслуговування клієнтів та засоби історичної аналітики.

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

Однак я не впевнений, з чого почати дізнаватися про створення власних форматів бінарних журналів. Який ваш досвід створення власних форматів журналів чи будь-яких рекомендованих статей / статей з цього питання?

Відповіді:


7

У Stendhal ми вирішили питання про продуктивність, додавши події гри до черги та обробляючи їх асинхронно у фоновому режимі .

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

Але написання журналу - лише одна сторона проблеми:

На які запитання ви хочете відповісти з журналами?

Легко просто прочитати повний журнал у хронологічному порядку; або відфільтрувати його для одного гравця.

Але можуть бути такі питання, як:

  • Які предмети Антон поклав на землю, які вчора забрала Бет? Який гравець їм зараз належить? (Антон поскаржився на те, що його предмет вкрали)
  • Скільки часу потрібно середньому гравцеві, щоб досягти рівня 100? Які гравці були значно швидшими? тільки для перших персонажів?
  • Чи є гравці, які обробляють величезні суми гри-грошей? До яких гравців передається? Без нічого цінного натомість?
  • Чи здатні слабкі гравці вбивати сильних істот, яких вони не мають змоги легально вбивати?
  • ...

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

Наша таблиця gameEvents налічує 51,429,139 рядків (минулого року), і у нас є спеціалізована таблиця журналів, яка містить 60 366 657 рядків (весь час) для 15 893 831 позицій.


Як швидко відбувається пошук через вашу базу даних? У мене є аналогічна база даних з журналами, і у нас є близько 100 000 000 рядків за три місяці. Ми використовуємо MySQL як сховище, і його продуктивність погана. Простий запит, у якому перераховані всі дії гравця (всього 20 000) рядків, займає часто більше 60 секунд.
Балон

1
Прості запити на індексних стовпцях миттєві. Складних запитів може зайняти небагато, запити трапляються за 60 секунд, але вони дуже рідкісні. Ми дуже індексували таблицю і компенсували штраф за вставку, виконуючи їх асинхронно.
Хендрік Бруммерман

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

4

Що ви розумієте під ефективністю? Незалежно від розміру диска чи швидкості запитів, реляційна база даних майже напевно обіграє або дорівнює вашому патентованому двійковому формату та буде набагато простішою та гнучкішою у використанні.

Кожна таблиця, яку ви використовуєте в реляційній БД, дозволяє вказувати точний байт, скільки місця в рядку ви збираєтеся дозволити. Якщо ви не реєструєте звичайний текст - а "журнал ігор подій (на відміну від журналів помилок / налагодження)" означає, що вам це не потрібно або, принаймні, не потрібно - тоді підхід поля фіксованої ширини реляційна база даних досить близька до оптимальної з точки зору простору, що робить їх досить швидкими в першу чергу. Крім того, реляційні бази даних дуже зручні в створенні індексів для дуже швидкого доступу та оптимізації запитів, щоб максимально використовувати їх.

Тому я рекомендую дотримуватися того, що у вас є.


Дякуємо за відповідь (і дякую іншим, хто подав відповіді нижче)! Чим більше я думаю про це, тим більше здається, що RDBMS є належним чином для цього конкретного типу лісозаготівлі. Розробити нестандартний формат журналу, який був би індексований для основних типів пошуку, було б непросто, але для сортування складних запитів, які часто використовуються в CSR та аналітиці ігор, необхідний більш загальний підхід - в який момент усталений продукт у більшості випадків перевершує.
Чарльз Елліс

Налаштування користувальницького журналу подій було б зручним для суворо хронологічного відтворення демонстраційних записів FLA FPS, але це дуже інша проблема, яку потрібно вирішити. Хтось має досвід розробки чогось подібного до демо-записів для масово багатокористувацьких клієнт-серверних ігор?
Чарльз Елліс

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

3

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


0

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

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

Як правило, ігрові події виглядають приблизно так (зокрема це формат DeltaDNA)

{
 "eventName":"specific event code – eg. gameStarted",
 "userID":"ABCD1-4321a879b185fcb9c6ca27abc5387e914",
 "sessionID":"4879bf37-8566-46ce-9f3b-bd18d6ac614e",
 "eventTimestamp":"yyyy-mm-dd hh:mm:ss.SSS",
 "eventParams":
  {
   "platform":"WEB",
   "param1":"stringParam",
   "param2":true,
   "param3":1234,
   "param4":["a","b","c"]
  },
}

Подія зазвичай включає ім'я події, ідентифікатор користувача, ідентифікатор сеансу, часову марку та параметри, які дозволяють записувати будь-які дані, які вам здаються корисними для запису навколо цієї події. На мій досвід, формати реляційних баз даних є найкращими для запису такої структури.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.