Download - сергей спиридонов
Сервер «Аллодов Онлайн». Архитектура и особенности
разработки
Требования:• Real-time• Работа 24/7• Отказоустойчивость
Сервер высоконагруженного приложения
Сложности:• Диагностика• Тестирование нагрузки• Проектирование
Сервер высоконагруженного приложения
Сравнительные параметры:• Производительность• Скорость разработкиТребования:• Memory management• Кроссплатформенность• Удобная IDE
Сервер. Выбор языка
Сервер. Выбор языкаJava C#
Managed + +
IDE Idea, Eclipse VS, MonoDevelop
Linux IDE Idea, Eclipse MonoDevelop
Удобная Linux IDE Idea, Eclipse
Компоненты:• Механика• Ядро (сервер)
Игровой сервер. Структура
Механика
СерверИгровая механика
Map-сервис
Система движен
ияПоиск пути
LoS
Сканер
Данные карты
Система сообщени
й
Database
сервисРепликац
ияРесурсная система
СетьVFS Логирование
• VFS• Логирование• Сеть• Ресурсная система
СерверИгровая механика
Map-сервис
Система движен
ияПоиск пути
LoS
Сканер
Данные карты
Система сообщени
й
Database
сервисРепликац
ияРесурсная система
СетьVFS Логирование
• Поиск пути
• LoS• Сканер• Репликация• Система сообщений• Ресурсная система
Сервер.Игровая механика
Map-сервис
Система движен
ияПоиск пути
LoS
Сканер
Данные карты
Система сообщени
й
Database
сервисРепликац
ияРесурсная система
СетьVFS Логирование
• Map-сервис• Database сервис• Система движения
СерверИгровая механика
Map-сервис
Система движен
ияПоиск пути
LoS
Сканер
Данные карты
Система сообщени
й
Database
сервисРепликац
ияРесурсная система
СетьVFS Логирование
• Общие данные• Серверные данные:– Репликация– Сообщения (Event, Message)
• Клиентские данные:– Команды (Command)
Взаимодействие с клиентом
«Репликация – это явление на клиенте божественного сервера.»
Тимур Бухараев.
Репликация
Репликация public final class Stat { private float base; private float result; }
Репликация@ReplicateClassClient @ReplicateClassServer public final class Stat { @ReplicateServer private float base; @ReplicateServer @ReplicateClient @Precision(-1) private float result; }
Репликация@ReplicateClassClient @ReplicateClassServer public final class Stat { @ReplicateServer private float base; @ReplicateServer @ReplicateClient @Precision(-1) private float result; }
class Stat : public Replicated { float result; public: const float GetResult() { return result; } void SetResult( float r ) { result = r; } }
Репликация@ReplicateClassClient @ReplicateClassServer public final class Stat { @ReplicateServer private float base; @ReplicateServer @ReplicateClient @Precision(-1) private float result; }
/** * Replication code, * generated automatically. * Don't change manually! * * @author ReplicatorsGenerator */ public interface StatReplica { float getBase(); float getResult(); }
Система сообщений public class MsgPosition extends Msg{ private float yaw; @NotNull private ConstPoint pos; }
Система сообщений@ReplicateOccurence public class MsgPosition extends Msg{ @Precision(2) private float yaw; @NotNull private ConstPoint pos; }
Система сообщенийclass MsgPosition : public Msg { Vec3 pos; float yaw; public: MsgPosition ( const Address & _from,
const Vec3 & _pos, float _yaw ): Msg( _from ),
pos( _pos ), yaw( _yaw ) {…} Vec3& GetPos(){ return pos; } float GetYaw(){ return yaw; } };
@ReplicateOccurence public class MsgPosition extends Msg{ @Precision(2) private float yaw; @NotNull private ConstPoint pos; }
Система сообщений@ReplicateOccurence public class MsgPosition extends Msg{ @Precision(2) private float yaw; @NotNull private ConstPoint pos; }
@ReplicateOccurence public class MsgPosition …{ public MsgPosition(… in){ super.readCpp(in); pos = new MutablePoint(in); yaw = in.readFloat(2); } public void writeCpp(… out){ super.writeCpp(out); pos.writeCpp(out); out.writeFloat(yaw, 2); } }
Ресурсная системаpublic class Cell { @NotNull private Zone [] zones; private int weight = 0; }
Ресурсная системаpublic class Cell { @NotNullElements (policy = REMOVE) @DenyDefault @NotNull private Zone [] zones; @AllowDefault private int weight = 0; }
Ресурсная системаpublic class Cell { @NotNullElements (policy = REMOVE) @DenyDefault @NotNull private Zone [] zones; @AllowDefault private int weight = 0; }
<cells> <Item> <zones> <Item href="Zone1"/> </zones> <weight>100500</weight> </Item> <Item> <zones> <Item href="Zones2"/> <Item href="Zones3"/> </zones> </Item> </cells>
Проверка клиента• Система арбитров• Проверка на сервере
Проверка клиентаСистема арбитров:• Ненадёжная• Дорогая реализация• Дешёвые проверки
Проверка клиентаПроверка на сервере:• Совсем ненадёжная• Дешёвая реализация• Дорогие проверки
• Unit-тесты• Функциональные• Нагрузочные (боты)• Performance-тесты• Стресс-тесты• Smoke-тесты
Автоматическое тестирование
• Тестирование нагрузки• Масштабирование• Внешние (GC, DB)• Отладка
Проблемы