сергей спиридонов

Preview:

DESCRIPTION

 

Citation preview

Сервер «Аллодов Онлайн». Архитектура и особенности

разработки

Требования:• 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)• Отладка

Проблемы

Сергей СпиридоновРазработчик сервера Аллодов Онлайн

/ Allods Teams.spiridonov@corp.mail.ru

СПАСИБО!

Recommended