Сервер «Аллодов Онлайн».
Архитектура и особенности разработки
Сервер высоконагруженного приложения
Требования:
• 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-сервис
                       движения Database
                                    сервис
         Поиск пути LoS Сканер
          Данные     Система
                                 Репликация
           карты    сообщений
         Ресурсная система        Сеть
               VFS           Логирование
Сервер
•   VFS                          Игровая механика
                                       Система
•   Логирование         Map-сервис
                                      движения Database
•   Сеть                Поиск пути LoS Сканер
                                                   сервис

•   Ресурсная система    Данные     Система
                                                Репликация
                          карты    сообщений
                        Ресурсная система        Сеть
                              VFS           Логирование
Сервер.
• Поиск пути                     Игровая механика
                                       Система
•   LoS                 Map-сервис
                                      движения Database
•   Сканер                                         сервис
                        Поиск пути LoS Сканер
•   Репликация           Данные     Система
                                                Репликация
•   Система сообщений     карты    сообщений
                        Ресурсная система        Сеть
•   Ресурсная система
                              VFS           Логирование
Сервер
• Map-сервис                  Игровая механика
                                    Система
• Database сервис    Map-сервис
                                   движения Database
• Система движения   Поиск пути LoS Сканер
                                                сервис
                      Данные     Система
                                             Репликация
                       карты    сообщений
                     Ресурсная система        Сеть
                           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       class Stat : public Replicated
@ReplicateClassServer       {
public final class Stat {     float result;
                            public:
    @ReplicateServer          const float GetResult()
    private float base;         { return result; }
    @ReplicateServer          void SetResult( float r )
    @ReplicateClient            { result = r; }
    @Precision(-1)
                            }
    private float result;
}
Репликация
@ReplicateClassClient       /**
@ReplicateClassServer         * Replication code,
public final class Stat {     * generated automatically.
                              * Don't change manually!
    @ReplicateServer          *
    private float base;       * @author ReplicatorsGenerator
    @ReplicateServer          */
    @ReplicateClient        public interface StatReplica {
    @Precision(-1)              float getBase();
    private float result;       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;
}
Система сообщений
@ReplicateOccurence         class MsgPosition : public Msg
public class MsgPosition    {
                                Vec3 pos;
      extends Msg{              float yaw;
  @Precision(2)             public:
  private float yaw;            MsgPosition (
  @NotNull                        const Address & _from,
  private ConstPoint pos;         const Vec3 & _pos, float _yaw ):
}                                        Msg( _from ),
                                         pos( _pos ), yaw( _yaw )
                                  {…}
                                Vec3& GetPos(){ return pos; }
                                float GetYaw(){ return yaw; }
                            };
Система сообщений
@ReplicateOccurence         @ReplicateOccurence
public class MsgPosition    public class MsgPosition …{
      extends Msg{            public MsgPosition(… in){
  @Precision(2)                 super.readCpp(in);
  private float yaw;            pos = new MutablePoint(in);
                                yaw = in.readFloat(2);
  @NotNull
                              }
  private ConstPoint pos;
                              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 {         <cells>
  @NotNullElements            <Item>
                                <zones>
      (policy = REMOVE)           <Item href="Zone1"/>
  @DenyDefault                  </zones>
  @NotNull                      <weight>100500</weight>
  private Zone [] zones;      </Item>
  @AllowDefault               <Item>
                                <zones>
  private int weight = 0;         <Item href="Zones2"/>
}                                 <Item href="Zones3"/>
                                </zones>
                              </Item>
                            </cells>
Проверка клиента
• Система арбитров
• Проверка на сервере
Проверка клиента
Система арбитров:
• Ненадёжная
• Дорогая реализация
• Дешёвые проверки
Проверка клиента
Проверка на сервере:
• Совсем ненадёжная
• Дешёвая реализация
• Дорогие проверки
Автоматическое тестирование
•   Unit-тесты
•   Функциональные
•   Нагрузочные (боты)
•   Performance-тесты
•   Стресс-тесты
•   Smoke-тесты
Проблемы
•   Тестирование нагрузки
•   Масштабирование
•   Внешние (GC, DB)
•   Отладка
СПАСИБО!
              Сергей Спиридонов
Разработчик сервера Аллодов Онлайн / Allods Team
           s.spiridonov@corp.mail.ru

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