Подсистема управления: различия между версиями

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
Строка 35: Строка 35:


{{Control_Message_Table}}
{{Control_Message_Table}}
Последовательность взаимодействия сторон [[Заглавная страница#Действующие лица и их роли|пользователя]], [[Веб-сервер|веб-сервера]] и [[Подсистема управления | подсистемы управления]], если пользователь создает модель среды, моделирует поле и получает результаты, в терминах запросов, следующая.
# [[Заглавная страница#Действующие лица и их роли|Моделирующий пользователь]] задает параметры среды моделирования - метрики и параметры предметной области - и передает их вместе с запросом на создание модели [[Веб-сервер|веб-серверу]].
# [[Веб-сервер]] формирует запрос CreateModelId и вызывает [[entry_point]] [[Подсистема управления|подсистемы управления]].
# [[Подсистема управления]] отвечает [[Веб-сервер|веб-серверу]] именем созданной модели, либо возвращает код ошибки.
## Если функцией [[entry_point]] возвращен ненулевой код ошибки, [[веб-сервер]] отвечает сообщением об ошибке клиенту, затем сценарий прерывается.
# [[Веб-сервер]] передает имя модели пользователю и освобождает буфер с именем вызовом функции [[FreeData]].
# В любом порядке пользователь создает наполнение пространства моделируемого поля: как минимум, по одному источнику и плоскости, а также геометрическую модель, составленную из полигональных объектов. Для каждого из создаваемых объектов выполняется следующее.
## [[Заглавная страница#Действующие лица и их роли|Моделирующий пользователь]] обращается к [[веб-сервер|веб-серверу]] с запросом на создание объекта-элемента модели. Модель задается именем, которым [[подсистема управления]] ответила на запрос [[CreateModelId]]. Создаваемый объект параметризуется также данными, определенными классом объекта и предметной областью, для которой создается объект (см. [[CreateObjectId]]).
## [[Веб-сервер]] формирует запрос [[CreateObjectId]] и вызывает функцию [[entry_point]].
## [[Подсистема управления]] отвечает [[Веб-сервер|веб-серверу]] именем созданного объекта, либо возвращает код ошибки.
### Если при создании объекта функция [[entry_point]] возвращает ненулевой код ошибки, соответствующий объект не создается, а сообщение об ошибке (см. [[GetErrorDescription]]) передается [[Заглавная страница#Действующие лица и их роли|пользователю]]. При этом ни сценарий, ни цикл создания объектов не прерывается.
## [[Веб-сервер]] передает имя созданного объекта пользователю и освобождает буфер с именем вызовом функции [[FreeData]].
# [[Заглавная страница#Действующие лица и их роли|Моделирующий пользователь]] обращается к [[веб-сервер|веб-серверу]] с запросом на запуск моделирования поля, параметризуя запрос именем модели пространства поля (возвращенным в результате запроса на создание модели) и именем (адресом) экземпляра подсистемы предметной области, который должен проводить моделирование.
# [[Веб-сервер]] Формирует запрос [[StartSimulationId]] и вызывает функцию [[entry_point]].
# [[Подсистема управления]] отвечает [[Веб-сервер|веб-серверу]] именем процесса моделирования, либо возвращает код ошибки.
## Если функций [[entry_point]] возвращен ненулевой код ошибки, процесс моделирования не создается. [[Веб-сервер]] отвечает [[Заглавная страница#Действующие лица и их роли|пользователю]] ошибкой. [[Заглавная страница#Действующие лица и их роли|Пользователь]] может изменять модель и заново отправлять запросы на запуск моделирования.
# [[Веб-сервер]] передает имя созданного процесса [[Заглавная страница#Действующие лица и их роли|пользователю]].
# [[Заглавная страница#Действующие лица и их роли|Пользователь]] начинает цикл опроса состояния процесса моделирования. При этом на каждой итерации выполняется следующее.
## [[Заглавная страница#Действующие лица и их роли|Пользователь]] запрашивает у [[веб-сервер|веб-сервера]] состояние процесса, идентифицируемого именем, возвращенным ответом на запрос на запуск моделирования.
## [[Веб-сервер]] формирует запрос [[GetProcessStatusId]], с которым вызывает функцию [[entry_point]].
### Если функция возвращает ненулевой код ошибки, сообщение об этом делегируется [[Заглавная страница#Действующие лица и их роли|пользователю]]. Состояние подсистемы управления при этом не определено.
### Если [[Заглавная страница#Действующие лица и их роли|пользователь]] указал неверный идентификатор процесса, функция [[entry_point]] завершится успешно (вернет нулевой код ошибки), однако ответом будет код <code>status_not_found</code>. В этом случае состояние [[подсистема управления|подсистемы управления]] стабильно, и она по-прежнему может принимать запросы. В этом случае [[веб-сервер]] должен освободить память ответа вызовом [[FreeData]].
## [[Веб-сервер]] делегирует ответ с состоянием процесса [[Заглавная страница#Действующие лица и их роли|пользователю]] и освобождает буфер ответа [[подсистема управления|подсистемы управления]] вызовом [[FreeData]]. Если процесс завершен, цикл прерывается.
# [[Заглавная страница#Действующие лица и их роли|Пользователь]] запрашивает у [[веб-сервер|веб-сервера]] результаты системы моделирования.
# [[Веб-сервер]] формирует запрос [[GetSimulationResultsId]] и вызывает функцию [[entry_point]].
# [[Подсистема управления]] формирует ответ с таблицей результатов (см. [[GetSimulationResultsId]]) и возвращает их, вместе с нулевым кодом ошибки, [[Веб-сервер|веб-серверу]].
## Если при создании объекта функция [[entry_point]] возвращает ненулевой код ошибки, сообщение об ошибке (см. [[GetErrorDescription]]) передается [[Заглавная страница#Действующие лица и их роли|пользователю]]. При этом сценарий не прерывается.
# [[Веб-сервер]] Формирует ответ [[Заглавная страница#Действующие лица и их роли|пользователю]] в необходимом формате и отправляет его.
# [[Заглавная страница#Действующие лица и их роли|Пользователь]] посылает запрос на закрытие процесса моделирования, параметризуя запрос именем процесса, полученным при запуске моделирования ([[StartSimulationId]]).
# [[Веб-сервер]] формирует запрос [[CloseSimulationId]] и вызывает функцию [[entry_point]] с ним.
## Если [[подсистема управления]] возвращает ненулевой код ошибки, сообщение об этом передается [[Заглавная страница#Действующие лица и их роли|пользователю]]. При этом фактического закрытия не происходит.
# [[Веб-сервер]] информирует [[Заглавная страница#Действующие лица и их роли|пользователя]] об успешном закрытии процесса, при этом ответа управляющей системы нет (кроме кода ошибки), поэтому выходной буфер не должен освобождаться.
# Сценарий останавливается.

Версия 19:12, 20 декабря 2015

Это - описание требований к системе. По текущей реализации см. control.

Подсистема управления - внутрипроцессный сервер, загружаемый в адресное пространство процесса веб-сервера. Функции подсистемы управления:

  • Централизованная балансировка нагрузки между узлами одной предметной области.
  • Реализация предметно-независимого описания геометрии среды, в которой моделируется поле. Такой описание дополняется специальными для предметной области параметрами, семантика которых имеет значение исключительно в соответствующей подсистеме предметной области.
  • Реализация политики безопасности, т.е. протоколов взаимодействия с Моделирующими пользователями с одной стороны, и с экземплярами подсистем предметной области с другой.

Последний пункт имеет значение, если система моделирования распределена, т.е. если пользователь, поставщик предметно-независимых сервисов и поставщик подсистемы предметной области - возможно разные лица с собственными, возможно конфликтующими, интересами.

Поскольку принципиальным является требование к масштабируемости, должна предоставляться возможность сборки всей моделирующей подсистемы в одну программу, объединяющую управляющую подсистему, конфигурируемый набор моделирующих подсистем и клиента в один процесс.


Интерфейс подсистемы управления, предоставляемый клиентам со стороны пользователя (напр., веб-серверу)

Схематичный интерфейс управляющей подсистемы, предоставляемый веб-серверу. Более подробно информация представлена в описании соответствующих запросов.

Функции

Все функции интерфейса экспортируются библиотекой управляющей подсистемы как С функции, т.е. имеют связывание в стиле C.

entry_point основная точка входа, которая выполняет обработку запросов пользователя
FreeData функция освобождения памяти, выделенной внутрипроцессным сервером при генерации ответа на запрос функцией entry_point.
GetErrorDescription функция получения описания ошибки по целочисленному коду, возвращенному другими интерфейсными функциями управляющей подсистемы.
SetErrorLogFile Установка файла текстового журналирования ошибок, возникающих в границах управляющей подсистемы.

Запросы

Конкретный пользовательский запрос задается параметром nFunctionId функции entry_point. Возможные значения параметра следующие.


Символическое имя Целочисленное значение Действие
CreateModelId 0 создание новой модели
CreateObjectId 1 создание нового элемента модели
UploadModelId 2 загрузка модели со стороны пользователя.
StartSimulationId 3 запуск физического моделирования в предметной области
GetProcessStatusId 4 получение сведений о состоянии процесса моделирования
GetSimulationResultsId 5 получение результатов моделирования
StopSimulationId 6 досрочная остановка процесса моделирования (не реализовано)
CloseSimulationId 7 закрытие моделирования и освобождение соответствующих ресурсов на сервере; если запущен процесс моделирования, то его остановка.

Последовательность взаимодействия сторон пользователя, веб-сервера и подсистемы управления, если пользователь создает модель среды, моделирует поле и получает результаты, в терминах запросов, следующая.

  1. Моделирующий пользователь задает параметры среды моделирования - метрики и параметры предметной области - и передает их вместе с запросом на создание модели веб-серверу.
  2. Веб-сервер формирует запрос CreateModelId и вызывает entry_point подсистемы управления.
  3. Подсистема управления отвечает веб-серверу именем созданной модели, либо возвращает код ошибки.
    1. Если функцией entry_point возвращен ненулевой код ошибки, веб-сервер отвечает сообщением об ошибке клиенту, затем сценарий прерывается.
  4. Веб-сервер передает имя модели пользователю и освобождает буфер с именем вызовом функции FreeData.
  5. В любом порядке пользователь создает наполнение пространства моделируемого поля: как минимум, по одному источнику и плоскости, а также геометрическую модель, составленную из полигональных объектов. Для каждого из создаваемых объектов выполняется следующее.
    1. Моделирующий пользователь обращается к веб-серверу с запросом на создание объекта-элемента модели. Модель задается именем, которым подсистема управления ответила на запрос CreateModelId. Создаваемый объект параметризуется также данными, определенными классом объекта и предметной областью, для которой создается объект (см. CreateObjectId).
    2. Веб-сервер формирует запрос CreateObjectId и вызывает функцию entry_point.
    3. Подсистема управления отвечает веб-серверу именем созданного объекта, либо возвращает код ошибки.
      1. Если при создании объекта функция entry_point возвращает ненулевой код ошибки, соответствующий объект не создается, а сообщение об ошибке (см. GetErrorDescription) передается пользователю. При этом ни сценарий, ни цикл создания объектов не прерывается.
    4. Веб-сервер передает имя созданного объекта пользователю и освобождает буфер с именем вызовом функции FreeData.
  6. Моделирующий пользователь обращается к веб-серверу с запросом на запуск моделирования поля, параметризуя запрос именем модели пространства поля (возвращенным в результате запроса на создание модели) и именем (адресом) экземпляра подсистемы предметной области, который должен проводить моделирование.
  7. Веб-сервер Формирует запрос StartSimulationId и вызывает функцию entry_point.
  8. Подсистема управления отвечает веб-серверу именем процесса моделирования, либо возвращает код ошибки.
    1. Если функций entry_point возвращен ненулевой код ошибки, процесс моделирования не создается. Веб-сервер отвечает пользователю ошибкой. Пользователь может изменять модель и заново отправлять запросы на запуск моделирования.
  9. Веб-сервер передает имя созданного процесса пользователю.
  10. Пользователь начинает цикл опроса состояния процесса моделирования. При этом на каждой итерации выполняется следующее.
    1. Пользователь запрашивает у веб-сервера состояние процесса, идентифицируемого именем, возвращенным ответом на запрос на запуск моделирования.
    2. Веб-сервер формирует запрос GetProcessStatusId, с которым вызывает функцию entry_point.
      1. Если функция возвращает ненулевой код ошибки, сообщение об этом делегируется пользователю. Состояние подсистемы управления при этом не определено.
      2. Если пользователь указал неверный идентификатор процесса, функция entry_point завершится успешно (вернет нулевой код ошибки), однако ответом будет код status_not_found. В этом случае состояние подсистемы управления стабильно, и она по-прежнему может принимать запросы. В этом случае веб-сервер должен освободить память ответа вызовом FreeData.
    3. Веб-сервер делегирует ответ с состоянием процесса пользователю и освобождает буфер ответа подсистемы управления вызовом FreeData. Если процесс завершен, цикл прерывается.
  11. Пользователь запрашивает у веб-сервера результаты системы моделирования.
  12. Веб-сервер формирует запрос GetSimulationResultsId и вызывает функцию entry_point.
  13. Подсистема управления формирует ответ с таблицей результатов (см. GetSimulationResultsId) и возвращает их, вместе с нулевым кодом ошибки, веб-серверу.
    1. Если при создании объекта функция entry_point возвращает ненулевой код ошибки, сообщение об ошибке (см. GetErrorDescription) передается пользователю. При этом сценарий не прерывается.
  14. Веб-сервер Формирует ответ пользователю в необходимом формате и отправляет его.
  15. Пользователь посылает запрос на закрытие процесса моделирования, параметризуя запрос именем процесса, полученным при запуске моделирования (StartSimulationId).
  16. Веб-сервер формирует запрос CloseSimulationId и вызывает функцию entry_point с ним.
    1. Если подсистема управления возвращает ненулевой код ошибки, сообщение об этом передается пользователю. При этом фактического закрытия не происходит.
  17. Веб-сервер информирует пользователя об успешном закрытии процесса, при этом ответа управляющей системы нет (кроме кода ошибки), поэтому выходной буфер не должен освобождаться.
  18. Сценарий останавливается.