Відмова: мій досвід програмування ігор базується на іграх на базі одного гравця на стороні клієнта, але я маю досвід роботи в веб-додатках (зокрема, на стеку Microsoft), тому саме звідки я надходжу з цією відповіддю, я відчуваю, що багато чого застосувати, але без фактичного тестування справжнього ігрового сервера важко сказати, як це застосовуватиметься, але тут ідеться. Знайте це: я не розгорнув ігровий сервер, а лише веб-сторінки.
Я б запропонував дворівневий (серверний) рівень підходу. Рівень бази даних та рівень "програми"; третій (презентаційний) рівень - ваш ігровий клієнт.
Реляційні бази даних, чудово підходять до запитів даних і гідні при записі даних. Ключовим моментом є серіалізація запису вашої бази даних у керовані розміри, з якими може працювати ваш кластер. Більш досконалі видання (Центр даних / Підприємство) SQL Server підтримують кластеризацію та реплікацію. Я б почав зі створення невеликого кластеру та запуску деяких запитів проти нього, щоб побачити, як він працює.
У ярусі додатків, якщо ви робите "зонування" чи щось подібне, ви, ймовірно, можете піти, не налаштовуючи жодних кластерів, і просто налаштувати сервер на зону. Якщо ваші зони стануть великими, ви можете встановити кластер для кожної зони.
Ви хочете побудувати процес серіалізації для надсилання даних із рівня рівня програми -> бази даних. Ключовим є те, що триває кілька рівнів серіалізації. Що - то на кшталт цього:
- Рівень 1: Зберігання в БД кожні X секунд, включає критичні дані:
- Здоров'я гравця
- Предмети гравця / пікапи
- Рівень 2: Зберігання в БД кожні 2X секунди, включає середні дані:
- Місцезнаходження гравця
- Місце розташування NPC
- Рівень 3: Все інше, як можна рідше
Це дозволить зберегти ваші записи послідовними та передбачуваними, залежно від характеру вашої гри, ви могли б мати нечасті записи в базі даних. Ключовим моментом є усвідомлення того, що якщо ваш сервер додатків вийшов з ладу, вам доведеться повертатися в Інтернет зі свого стану у вашій базі даних, тому серіалізація інвентаря гравців кожні 90 хвилин може викликати засмучення гравців.
Для читання даних вам потрібно буде якомога більше завантажувати пам'ять у рівень додатків, а потім гарантувати, що весь ваш код використовує цей пул пам’яті, на задньому плані ви можете синхронізувати пул пам’яті з базою даних. Як зазначає Джо, буде час, коли вам знадобляться транзакції в режимі реального часу. Серіалізувавши більшість записів, у вас все одно має бути достатній IO у вашій базі даних, щоб робити операції в режимі реального часу, коли це необхідно, припускаючи достатнє обладнання на сервері / кластері бази даних.