Постарайтеся, щоб це було максимально простим, а інтерфейси були чітко визначені та задокументовані. Утримання та налагодження складної системи у виробництві легко перетворюється на пекло. Тож якщо є простий і складний підхід, подумайте двічі, перш ніж перейти до складного.
Визначення послуг
Я думаю, що перший крок - виявлення послуг та їх залежностей : Статичний вміст, Аутентифікація, Локальний чат, Глобальні канали чату, Регіональні чатові канали, Список друзів, Гільдії, Сумка / Інвентар, Аукціонний дім, Глобальна карта, Світ, ...
Тоді для кожної з цих послуг вирішується, чи може клієнт спілкуватися з ними безпосередньо. Наприклад, досить просто дозволити клієнту спілкуватися безпосередньо з серверами, відповідальними за глобальні канали чату. Світові сервери взагалі не повинні брати участь у чатових повідомленнях. Регіональний чат може бути реалізований аналогічно, але світові сервери повинні повідомляти сервери чату, коли гравці змінюють регіони. Знову ж таки, їм не потрібно дбати про повідомлення.
Третій крок - продумати балансування навантаження в рамках послуги . Наприклад, глобальні та регіональні канали чату можуть бути розділені на декілька серверів залежно від їх імені. Це, мабуть, гарна ідея не важко кодувати цей розкол на клієнта, а надавати послугу пошуку.
Світові сервери
Найскладніша частина зазвичай - це світові сервери , тому я починаю з простого підходу. Ймовірно, це гарна ідея дозволити клієнту спілкуватися безпосередньо з сервером, відповідальним за регіон, в якому він перебуває. Тож при вході в систему або перетині регіону клієнту потрібно повідомити, до якого сервера потрібно підключитися.
Простий підхід - розділити світ на незалежні регіони . Під незалежними регіонами я маю на увазі, що гравець не може переходити з однієї частини в іншу, а монстри не можуть перетинати частини. Ці регіони відрізняються від регіонів, які бачать гравці, виходячи з пейзажу та історії зовнішнього світу. Зазвичай більшість монстрів перебувають у підземеллях, і гравці, як правило, приймають, що їм потрібно пройти через шлюз, щоб увійти в підземелля. Особливо, якщо ці підземелля інсталюються на основі групової групи гравців. Інші приклади зовнішнього світу - це різні материки та долини, оточені високими горами.
Безперервний світ підхід стає складним дуже швидко, так що має сенс планувати це добре: Яку інформацію про необхідність клієнта? Якою інформацією сервери повинні ділитися? Гравець в основному буде взаємодіяти лише з об'єктами (включаючи монстрів та NPC) у тому ж регіоні. Можна обдурити, розмістивши предмети поза межами кліку від межі зони. Це означає, що клієнта в основному цікавить лише інформація для читання сусідніх зон. У цих випадках зональним серверам не потрібно нічого узгоджувати, крім дозволу перевірити, чи програвач достатньо близько, щоб підключитися до сусідньої зони.
Це залишає лише дуже малу кількість складних випадків, коли об’єкти або дії повинні перетинати межу сервера. Це добре, тому що такі випадки, як стріли та заклинання, є критично важливими. Можливо, буде гарною ідеєю розділити боротьбу на атаку та оборону. Таким чином, сервер заклинання визначатиме параметри атаки, включаючи позицію ролика. Сервер захисника отримає повідомлення про атаку та обчислить вплив. Сервер зловмисника не повинен знати про вплив; клієнт дізнається про це, використовуючи підключення лише для читання.
Залежно від того, наскільки складна ваша модель програвача, перенесення її на інший сервер може зайняти кілька секунд (Second Life має величезну проблему з цим). Проблему можна усунути, попередньо підготувавши передачу, коли гравець наблизиться до віртуальної межі. Так що більшість даних про програвач вже кешовані на сервері призначення, коли відбудеться фактична передача даних.
Підсумок
Розділіть проблему, визначивши різні сервіси, які можна розділити на сервери з невеликими залежностями. У наступному кроці подивіться, як зробити баланс завантаження в критичних службах. Делегуйте роботу з балансування клієнту, доручивши йому підключитися безпосередньо до відповідних серверів (очевидно, сервери повинні перевірити дозволи). Зберігайте це якомога простіше, добре документуйте обов'язки різних служб і серверів, надайте можливість ввімкнути вихід налагодження.
PS: Деякі з цих методів можна використовувати для підвищення надійності. І ви повинні пам’ятати про це, оскільки використання багатьох серверів означає набагато більший ризик зламання речей; не тільки в програмному, але і на апаратному рівні.