Описание проекта ERP-системы
 
Наша группа разработчиков спроектировала и разрабатывает ERP-систему. Проект подразумевает создание системы сравнимой
по возможностям с такими системами как Axapta, 1С,
Эталон. Мы исследовали возможности ведущих ERP систем, и попытались объединить в нашем проекте сильные
стороны каждой из них.
 
Нашей целью является создание системы, максимально удобной
для прикладных разработчиков, обладающей высокой производительностью и
масштабируемостью.
 
Основной идеей нашего проекта является построение
системы-конструктора как основы для построения широкого спектра корпоративных
бизнес-приложений.
 
Ниже описана структура системы и основные технические
решения, используемые в ее компонентах.
 
Структура системы
 

 
Центральный сервер – управляет метаданными
бизнес-приложения, авторизацией пользователей, разграничением прав
пользователей, распределяет нагрузку между серверами приложений. Также
центральный сервер управляет кластерами серверов приложений. Один центральный
сервер может обслуживать несколько независимых бизнес-приложений. Каждое из
бизнес-приложений функционирует на своем кластере из серверов приложений.
 
Сервер приложений – служит рабочей средой для
бизнес-приложения, исполняя код бизнес-приложения, кэшируя его метаданные и
информацию о правах пользователей. Каждый сервер приложений имеет
интертранзакционный кэш, в котором кэшируются данные объектов
бизнес-приложения. Взаимодействуя в кластере, сервера приложений обеспечивают
консистентность данных в своих кэшах.
 
Клиент – представляет собой графический интерфейс
пользователя. Графический интерфейс состоит из таких элементов как формы,
отчеты, главное меню и пр., и является частью метаданных бизнес-приложения.
Клиент также выполняет функции кэширования данных бизнес-приложения,
отображаемых в компонентах пользовательского интерфейса.
 
Физическая структура системы 
 
Компоненты системы, описанные выше, представляют собой
сервисы, которые можно запускать в любом количестве на любом из компьютеров
локальной сети. Перечислим наиболее вероятные варианты физического расположения
компонентов системы:
 - Все серверные компоненты, включая СУБД, находятся на одном
     компьютере. Эта конфигурация рекомендуется в случае небольшой нагрузки. В
     этом случае кластеризация не имеет смысла и каждое бизнес-приложение
     выполняется на одном сервере приложений.
- Каждый из серверных компонентов, включая СУБД, находится
     на отдельном компьютере. В этом случае рекомендуется запускать
     бизнес-приложение на нескольких серверах приложений соединяя их в кластер.
     Эта конфигурация рекомендуется в случае большого количества клиентов. В
     ней используются свойства масштабируемости описываемой системы.
- Также возможны любые промежуточные варианты.
 
Основные решения архитектуры и реализации ядра системы
 
 - Виртуальная машина для кода бизнес-приложения (на сервере
     приложений)
  - Статически типизированный объектно-ориентированный язык
      программирования, синтаксически идентичный C#.
   - Встроенный объектный язык запросов
- Дополнительные типы данных с семантикой NULL-значения баз данных (undefinable-типы)
    - Специальный синтаксис объявления типа: int#, MyObject#.
- Константа undefined,
        отличная от константы null.
- Встроенные арифметические и прочие операторы
        поддерживают семантику данных типов.  Дополнительно существует оператор
        defined.
- Результатом чтения любого свойства undefined-объекта
        будет значение undefined соответствующего
        undefinable-типа.
- Компиляция в байт-код и его исполнение.
- Возможность одновременного исполнения большого количества
      сессий за счет использования ими общих метаданных (байт-кода, и пр.).
      Сессия представляет собой изолированную среду исполнения байт-кода.
   - Код каждой транзакции бизнес-приложения исполняется
       изолированно, в отдельной сессии.
- Перемещающий сборщик мусора (compacting gc), с двумя поколениями.
- Интеграция сборщика мусора с ORM исключает
       необходимость использования слабых ссылок при организации кэша объектов
       транзакции бизнес-приложения.
- Работа с данными
  - Система имеет встроенный ORM.
- Система имеет объектный язык
      запросов.
   - Возможность присвоения объектного
       запроса с подставленными параметрами в качестве значения переменной в
       коде бизнес-приложения. Эта возможность позволяет использовать один
       запрос в секи from другого запроса подставляя его в качестве параметра.
- Сервер приложений имеет интертранзакционный кэш со
      следующими возможностями:
   - Данные кэшируются между транзакциями на протяжении всей
       работы сервера приложений.
- Экономия памяти за счет отсутствия лишних копий данных объектов
       в каждой из транзакций и эффективной стратегии распределения памяти
       используемой кэшем.
- Кэш поддерживает строгую консистентность данных в
       режимах read-committed и snaphot, позволяя
       разработчику не беспокоиться об аномалиях согласованности данных,
       связанных с наличием кэша.
    - Для операций чтения данных выполняется правило: каждое
        последующее чтение данных (содержащихся в кэше или нет) возвращает
        данные не старее чем предыдущее чтение.
- Все вышеперечисленные свойства кэша сохраняются и при
       работе серверов приложений в кластере.
- Предсказание доступа к данным (prefetching).
   - Основано на сборе и использовании статистики внутри
       транзакции с учетом контекстов исполнения предоставляемых виртуальной
       машиной для любой из точек исполнения байт-кода в которой происходит
       доступ к данным (Context Based Prefetching).
- Также постоянно ведется сбор статистики эффективности
       оптимизатора. Данная статистика позволяет выявить отдельные места, где
       автоматическая оптимизация работает неэффективно. Данная статистика
       используется самим оптимизатором как обратная связь, корректируя его
       работу.
- Программист или администратор может анализировать
       статистику предсказания, пользуясь специальной GUI-программой.
    - Программа позволяет показывать статистику предсказания
        в графическом виде с обозначением тех мест, где автоматическая
        оптимизация работает неэффективно.
- Пользователь имеет возможность расставлять явные хинты
        оптимизатору в таких местах.
- Вышеперечисленные возможности вместе образуют
       сбалансированную систему, которая позволяет:
    - Избавить разработчика от необходимости расставлять
        большое количество хинтов в коде бизнес-приложения.
- Дает разработчику возможность расставлять хинты только
        в проблемных местах, на графическом представлении статистики (а не в
        коде)  и всегда по актуальной статистике.
- Вырабатывает у пользователя такой стиль
        программирования, при котором необходимость расставлять хинты возникает
        редко.
- Клиентское приложение. На текущем этапе разработки
     планируется как графическое приложение Win32.
  - Динамически строит пользовательский интерфейс на основе
      форм, отчетов, меню и других элементов пользовательского интерфейса,
      определенных в метаданных бизнес-приложения.
- Содержит кэш объектов бизнес-приложения необходимых для
      отображения.
   - К данному кэшу не предъявляется строгих требований по
       консистентности данных.
- Кэш отслеживает идентичность объектов, предотвращая
       появление более одной копии бизнес-объекта. Данная особенность
       используется для синхронизации отображения одного и того же объекта
       двумя или более формами.
- Вся прикладная логика выполняется на сервере приложений.
       Клиентское приложение занимается только отображением и вводом данных
       пользователем.
 
Структура бизнес-приложения и процесс его разработки
 
Экземпляр системы может содержать некоторое количество моделей
и информационных баз данных. 
Модель представляет собой исходный код бизнес-приложения в
виде дерева метаобъектов бизнес-приложения (пространств имен, классов, форм,
отчетов и др.). Сама модель не является бизнес-приложением и не может
исполняться системой. 
Для исполнения бизнес-приложения необходимо создать новую
информационную базу данных на основе модели либо регенерировать уже
существующую. Информационная база данных хранит данные и метаданные
бизнес-приложения. Регенерированная информационная база данных далее не зависит
от исходной модели.
 
Процесс разработки бизнес-приложения представляет собой
редактирование модели в конфигураторе, который представляет собой среду быстрой
разработки и содержит различные дизайнеры и редактор прикладного кода.
 
Вся модель целиком или ее отдельные метаобъекты может быть
скомпилирована. В результате компиляции создаются зависимости между
метаобъектами. Дальнейшее редактирование метаобъекта приводит к его инвалидации
и инвалидации зависимых от него метаобъектов.
 
Существует специальный отладочный режим работы с моделью, в
котором она инкрементально компилируется в процессе работы бизнес-приложения.
Это позволяет сократить время запуска бизнес-приложения при отладке, и таким
образом облегчить его разработку.
 
Средства разработки и текущее состояние проекта.
 
Проект разрабатывается на языке C++
и представляет собой набор dll библиотек.
Для сетевого взаимодействия между компонентами системы используется технология CORBA, в реализации ACE TAO. В настоящий момент код
компилируется компилятором C++ Builder
6, однако проект разрабатывается как кросс-платформенный и портирование на
другие компиляторы не должно вызвать затруднений.
Приложения пользовательского интерфейса (клиент, среда
разработки, административные утилиты) разрабатываются на Delphi Win32 с использованием клиентских
библиотек ядра системы (C++).
 
Состояния компонентов ядра на текущий момент:
 - Компилятор прикладного языка и виртуальная машина
     полностью реализованы.
- ORM
  - Интертранзакционный кэш - полностью реализован.
- DSL для
      объявления классов персистентных объектов – реализован и встроен в
      компилятор прикладного языка.
- Подсистемы предсказания доступа к данным – спроектирована
      и частично реализована.
- Объектный язык запросов – находится в стадии
      проектирования.
- Модели
  - Полностью реализованы серверная часть и библиотека для
      клиентской части.
- Реализован минимальный тестовый набор метаобъектов.
      Конкретный набор метаобъектов, необходимых для разработки
      бизнес-приложений (формы, справочники, и пр.), является предметом
      дальнейших исследований.
- Информационная база данных
  - Полностью реализован генерации (регенерации)
      информационной базы данных по модели, включая обновление метаданных и
      структуры таблиц данных бизнес-приложения. Также реализован режим
      регенерации с инкрементальной компиляцией.
- Сервер приложений
  - Реализован механизм запуска кластера серверов приложений
      для тестовых целей. Отсутствует API и
      административные утилиты, необходимые для конфигурирования кластера.
- Встроены необходимые глобальные подсистемы: ORM (интертранзакционный кэш, кластеризация), виртуальная
      машина (подгрузка и кэширование метаданных и кода).
- Реализована поддержка клиентских сессий. Пользуясь
      глобальными подсистемами клиентская сессия может исполнять код бизнес
      транзакций.
- Таким образом, реализовано все необходимое для выполнения
      минимального тестового бизнес-приложения (тестовых транзакций написанных
      на прикладном языке при помощи соответствующего тестового набора
      метаобъектов модели).
- В настоящий момент приложения пользовательского интерфейса
     отсутствуют. Имеется одно тестовое приложение, позволяющее создавать и
     редактировать модели, создавать и регенерировать информационные базы
     данных и запускать тестовые бизнес-транзакции.