Асинхронная загрузка¶
Раздел Асинхронная загрузка предоставляет возможность мониторинга и управления асинхронной загрузкой файлов из филиалов в центральное файловое хранилище. Для отображения раздела в параметре sections конфигурационного файла «config.json» Web-администратора должно быть указано значение delivery. На навигационной панели раздел имеет иконку
.
Сервис асинхронной загрузки устанавливается в головном офисе (исполнительном аппарате) и обеспечивает асинхронное получение файлов от агентов асинхронной загрузки в филиалах и загрузку файлов в Хранилище контента.
Для работы с модулем «Асинхронная загрузка» пользователь должен обладать:
-
Для исполнительного аппарата:
-
привилегией Администратор системы асинхронной загрузки файлов;
-
правом на работу в разделе Удаленные филиалы (просмотр, создание, изменение, удаление подключений удаленных филиалов);
-
правом на работу в разделе Правила загрузки (просмотр, создание, изменение, удаление подключений правил отбора файлов для асинхронной загрузки).
-
-
Для филиала:
-
привилегий Управление асинхронной загрузкой в подразделении;
-
правом на работу в разделе Правила загрузки (просмотр, создание, изменение, удаление подключений правил отбора файлов для асинхронной загрузки).
-
Функционал администрирования для филиала и для исполнительного аппарата имеет отличия:
-
Функционал исполнительного аппарата:
-
просмотр сведений по каждому филиалу;
-
создание нового подключения удаленного филиала;
-
редактирование и удаление существующих подключений удаленных филиалов;
-
настройка бизнес-правил асинхронной загрузки файлов в Хранилище контента ИА.
-
-
Функционал филиала:
-
мониторинг файлов, ожидающих загрузки в Хранилище контента ИА из хранилища отправляемых файлов;
-
мониторинг файлов, загружаемых в хранилище файлов;
-
управление загрузкой файлов в Хранилище контента ИА;
-
просмотр загружаемых файлов;
-
просмотр незагруженных файлов в состоянии Ошибка: запуск повторной загрузки по расписанию, немедленный запуск повторной загрузки, возобновление загрузки по расписанию, возобновление загрузки немедленно;
-
настройка времени хранения записи об успешно загруженных и неуспешно загруженных файлах;
-
просмотр бизнес-правил асинхронной загрузки файлов в Хранилище контента ИА.
-
-
Агент асинхронной загрузки периодически запрашивает информацию о состояниях отправляемых файлов из сервиса (п. Механизм отправки файлов агентом асинхронной загрузки).
Часовой пояс при расчете времени обработки файлов выбирается следующим образом:
- если указано расписание «Каждые X часов или минут», то для расчета используется UTC, поэтому файлы будут выгружены по московскому времени;
- если указано расписание «Ежедневно в X часов», то будет использоваться локальное время филиала.
Важно! Если администратор в разделе Очередь загрузки запускает загрузку файлов с помощью кнопок [Возобновить немедленно] или [Повторить немедленно], то обработка файла запускается немедленно.
Схема работы асинхронной загрузки файлов¶
Файлы временно хранятся в файловом кэше на стороне филиала. Механизм обеспечивает централизованную отложенную загрузку файлов из филиалов в исполнительный аппарат.
В работе асинхронной загрузки задействованы следующие службы:
- Со стороны исполнительного аппарата:
- Сервер контента;
- Хранилище контента;
- LanDocs.FileCacheApi (кэширование файлов);
- Сервис асинхронной загрузки.
- Со стороны филиала:
- LanDocs.WebAPI;
- LanDocs.FileCacheApi (кэширование файлов);
- Агент асинхронной загрузки.
Основными компонентами, обеспечивающими загрузку файлов, являются сервис асинхронной загрузки и агент асинхронной загрузки. Загрузка файлов между ними осуществляется посредством разделения файла на куски (чанки) и их передачу через IBM MQ в виде сообщений.
Данные, необходимые для подключения к IBM MQ, указываются в разделе Удаленные филиалы (п. Удаленные филиалы) и в настройках соответствующих сервисов.
Сервис асинхронной загрузки отвечает за:
- хранение информации о статусах загрузки файлов;
- получение сообщений из IBM MQ;
- сборку файлов из чанков и проверку их целостности;
- сохранение файлов в Хранилище контента;
- кэширование файлов.
Агент асинхронной загрузки отвечает за:
- разбиение файлов на чанки;
- получение чанков из кэша файлов;
- упаковку чанков в сообщения IBM MQ и отправку сообщений.
Информация о файле для асинхронной загрузки поступает сервису асинхронной загрузки от Сервера контента при регистрации файла (при асинхронной загрузке файл регистрируется в Хранилище контента исполнительного аппарата без контента). Также указывается хэш файла для его проверки после окончательной загрузки файла.
Мониторинг функционирования служб асинхронной загрузки¶
Мониторинг функционирования служб со стороны исполнительного аппарата (http://localhost/ldm-filedeliveryservice/) и филиалов (http://localhost/ldm-filedeliveryagent-service/) осуществляется путем вызова методов:
- для исполнительного аппарата – через вызов метода API GET /actuator/health сервиса асинхронной загрузки;
- для филиала – через вызов метода API GET /actuator/health агента асинхронной загрузки.
В ответах методов информация о статусах сервисов отображается в /actuator/health:
- status – возможные значения UP (ошибки нет) и WARNING (ошибка сервиса);
- details – содержит информацию об отслеживаемой компоненте:
- Для сервиса асинхронной загрузки:
- Хранилище контента – параметр contentStorage;
- Сервером контента – параметр contentServer;
- IBM MQ – параметр ibmMq;
- рабочая директория – параметр fileStorage.
- Для агента асинхронной загрузки:
- WebAPI – параметр remoteRepository;
- IBM MQ – параметр ibmMq.
- Для сервиса асинхронной загрузки:
Подробное описание параметров ответов методов мониторинга функционирования служб асинхронной загрузки приведено в таблице.
Параметры ответов методов мониторинга функционирования служб асинхронной загрузки
| Путь | Описание | Обязательно | Комментарий |
|---|---|---|---|
| status | Общий статус приложения | + | Возможные значения UP и WARNING. Если хотя бы один компонент имеет статус WARNING, то общий статус становится WARNING |
| details | Детали состояния приложения | + | Содержит список компонент с описанием их статусов и деталей |
| Сервис асинхронной загрузки |
|||
| details.fileStorage | Состояние компонента для работы с директорией сервиса | + | Обновляется, когда компонент для работы с директорией сервиса пытается выполнить промежуточное сохранение файла. Если ни одного сохранения не было выполнено, то будет пустым |
| details.fileStorage.dateTime | Время последнего выполнения сохранения | - | |
| details.fileStorage.details | Детали состояния компонента для работы с директорией сервиса | - | |
| details.fileStorage.details.errorMessage | Сообщение о возникшей ошибке | - | |
| details.contentStorage | Состояние компонента для работы с Хранилищем контента | + | Содержит список операций, которые выполняет компонент для работы с ХК. Список операций: - PingAsync; - ContinuePreloadFilePartAsync; - GetFileInfoById. Если ни одной операции не было выполнено, то будет пустым |
| details.contentStorage.[название операции] | Состояние выполненной операции | - | Обновляется после попытки выполнения операции |
| details.contentStorage.[название операции].status | Статус выполненной операции | - | Возможные значения UP и WARNING |
| details.contentStorage.[название операции].details | Детали состояния операции | - | |
| details.contentStorage.[название операции].details.dateTime | Время выполнения последней операции | - | |
| details.contentStorage.[название операции].details.errorMessage | Сообщение о возникшей ошибке во время операции | - | |
| details.contentServer | Состояние компонента для работы с Сервером контента | + | Содержит список операций, которые выполняет компонент для работы с Сервером контента. Список операций: - Login; - GetObjectsListAsync; - PingSessionAsync; - SaveOperToLog. Если ни одной операции не было выполнено, то будет пустым |
| details.contentServer.[название операции] | Состояние выполненной операции | - | Обновляется после попытки выполнения операции |
| details.contentServer.[название операции].status | Статус выполненной операции | - | Возможные значения UP и WARNING |
| details.contentServer.[название операции].details | Детали состояния операции | - | |
| details.contentServer.[название операции].details.dateTime | Время выполнения последней операции | - | |
| details.contentServer.[название операции].details.errorMessage | Сообщение о возникшей ошибке во время операции | - | |
| details.ibmMq | Состояние компонента для работы с IBM MQ | + | Содержит список обработчиков IBM MQ. Названия обработчиков указываются в формате «{название менеджера очереди} ({название очереди})». Обработчик появляется в списке после первой попытки подключения |
| details.ibmMq.[обработчик] | Состояние последней операции, выполненной обработчиком | - | Обновляется после попытки выполнения операции |
| details.ibmMq.[обработчик].status | Статус последней операции, выполненной обработчиком | - | Возможные значения UP и WARNING |
| details.ibmMq.[обработчик].details | Детали последней операции, выполненной обработчиком | - | |
| details.ibmMq.[обработчик].details.dateTime | Время последнего выполнения операции обработчиком | - | |
| details.ibmMq.[обработчик].details.errorMessage | Сообщение о возникшей ошибке во время последней операции, выполненной обработчиком | - | |
| Агент асинхронной загрузки |
|||
| details.ibmMq | Состояние компонента для работы с IBM MQ | + | Содержит список обработчиков IBM MQ. Названия обработчиков указываются в формате «{название менеджера очереди} ({название очереди})». Обработчик появляется в списке после первой попытки подключения |
| details.ibmMq.[обработчик] | Состояние последней операции, выполненной обработчиком | - | Обновляется после попытки выполнения операции |
| details.ibmMq.[обработчик].status | Статус последней операции, выполненной обработчиком | - | Возможные значения UP и WARNING |
| details.ibmMq.[обработчик].details | Детали последней операции, выполненной обработчиком | - | |
| details.ibmMq.[обработчик].details.dateTime | Время последнего выполнения операции обработчиком | - | |
| details.ibmMq.[обработчик].details.errorMessage | Сообщение о возникшей ошибке во время последней операции, выполненной обработчиком | - | |
| details.remoteRepository | Состояние компонента для работы с WebAPI | + | Содержит список выполняемых REST-методов. Если ни одного запроса не произошло, то будет пустым |
| details.contentServer.[REST метод] | Состояние выполненного запроса | - | Обновляется после попытки выполнения вызова метода |
| details.contentServer.[REST метод].status | Статус выполненного запроса | - | Возможные значения UP и WARNING |
| details.contentServer.[REST метод].details | Детали выполненного запроса | - | |
| details.contentServer.[REST метод].details.dateTime | Время выполнения последнего запроса | - | |
| details.contentServer.[REST метод].details.errorMessage | Сообщение о возникшей ошибке | - |
Механизм отправки файлов агентом асинхронной загрузки¶
Агент асинхронной загрузки использует внутренний таймер для выполнения периодических операций. Параметры запуска таймера и периоды выполнения операций определяются настройками агента. С помощью таймера агент периодически запрашивает информацию о состояниях отправляемых файлов из сервиса асинхронной загрузки. Через синхронизацию агент получает информацию о текущем статусе файла и прогрессе его загрузки (прогресс указывает размер загруженной части файла). Через изменение состояния и прогресса агент узнает о необходимости отправки файла и получает подтверждение обработки сообщений и загрузки файла.
Файл загружается порционно. Для этого со стороны агента определено окно – максимальный размер части файла, который может быть отправлен без ожидания подтверждения загрузки. Окно может состоять из одного или нескольких чанков в зависимости от настроек. Агент отправляет чанки, не ожидая подтверждения доставки, до тех пор, пока размер отправленной части файла не достигнет размера окна. После чего агент начинает ждать подтверждения доставки через механизм синхронизации. Если подтверждение получено, то отправка продолжится. Если подтверждение не получено, то это сигнализирует о проблемах доставки, отправка файла приостанавливается.
С помощью механизма синхронизации агент асинхронной загрузки получает от сервиса информацию о начале загрузки – статус файла меняется на В очереди. Таймер периодически проверяет список файлов и помещает файлы в соответствующих статусах в очередь для обработки. Файлы из очереди для обработки берутся порционно и обрабатываются параллельно.
Очередь отправки¶
В Системе используется распределенная очередь отправки с хранением копии всех данных в центре. При регистрации файла для отправки или выполнении команд на переотправку сначала вносятся изменения в центральную БД в исполнительном аппарате, а затем команда регистрируется локально.
В агенте асинхронной загрузки используется база данных (типа SQLite), которая хранит список файлов и их статусы. Если файла с БД нет, то он создается и заполняется данными из сервиса асинхронной загрузки. БД используется для отправки файлов при наступлении времени.
Файл по умолчанию хранится по пути: /var/lib/landocs/async-agent/files.db3.
Таблица «FileQueue» во многом повторяет структуру таблицы в филиале: адресная информация о самом филиале отсутствует и добавлено поле «lastSentOffset» для хранения смещения отправленных данных. Поля «dataChangedDateTime», «receivedChunks», «receivedContOffset» содержат данные, полученные из сервиса асинхронной загрузки, и используются для трассировки прогресса. Остальные поля заполняются командами.
Таблица «Settings» хранит данные, изменяемые администратором. Начальные данные заносятся из конфигурации. В поле «lastServerCheckTime» хранится время последней успешной синхронизации данных с сервисом асинхронной загрузки. Бизнес-правила отправки файлов разных типов обрабатываются в WebAPI (backend Web-клиента). На основании правил определяется время начала отправки и сохраняется в сервис асинхронной загрузки и в агент асинхронной загрузки. Сервисы асинхронной загрузки получают и хранят только результат вычисления времени (когда надо отправить файл из филиала в исполнительный аппарат). Данные сервиса асинхронной загрузки используются только как резервная копия, агент асинхронной загрузки для отправки использует данные из своей БД на основе SQLite.
Общий алгоритм обработки и отправки файлов¶
Файл разбивается на чанки, которые обрабатываются по очереди:
- Из файлового кэша запрашивается чанк.
- Формируется сообщение, содержащее фрагмент файла (чанк) и дополнительную информацию о файле и чанке (смещение от начала).
- Сообщение отправляется в очередь IBM MQ. Данные для подключения и отправки сообщения берутся из настроек. В случае ошибки подключения к IBM MQ или ошибки отправки будут совершены дополнительные попытки отправки через некоторое время. Количество попыток и интервал времени определяется настройками агента асинхронной загрузки.
- Если это последний чанк, входящий в файл, ожидается подтверждение полной загрузки файла – перехода файла в сервисе в статус Загружен.
- Если это последний чанк, входящий в окно, ожидается подтверждение загрузки окна.
- Осуществляется переход к следующему чанку.
Подтверждение загрузки окна¶
Для подтверждения загрузки окна агент асинхронной загрузки использует информацию о прогрессе загрузки, полученной через механизм синхронизации с сервисом. Агент проверяет, что прогресс соответствует ожидаемому значению. Если проверка не была успешна, то будет совершены дополнительные попытки проверки через некоторое время. Количество попыток и интервал между ними определяется настройками агента. Если загрузку окна не удалось подтвердить, то файл будет переведен в статус ошибки (только на стороне агента). Доставка таких файлов может быть продолжена позже. Возможность обработки файлов в статусе ошибки определяется настройками агента.
Агент асинхронной загрузки поддерживает режим доставки блоками. При доставке блоками ожидается загрузка окна целиком.
Алгоритм подтверждения загрузки при доставке блоками:
- Если прогресс загрузки соответствует последнему чанку, отправленному в окне, то подтверждение получено. Иначе будет выполнено несколько попыток получить подтверждение через некоторое время. Максимальное количество попыток и интервал между ними определяется настройками.
- Если подтверждение не получено, но при этом прогресс обновился, то количество попыток сбросится.
- Если количество попыток превышено, то в очередь будет отправлена та часть окна, которую не удалось подтвердить. После чего снова будет запущена проверка подтверждения загрузки. Максимальное количество попыток ожидания подтверждения и переотправки окна определяется настройками.
- Когда число попыток ожидания подтверждения и переотправки окна будет превышено, то файл перейдет в состояние ошибки.
Механизм загрузки файлов сервисом асинхронной загрузки¶
Загрузка файлов со стороны сервиса обеспечивается обработчиками. Осуществляется параллельное получение и обработка сообщений из IBM MQ. Количество параллельной обработки задается в конфигурационном файле сервиса асинхронной загрузки.
Во время обработки сообщений сервис обновляет прогресс не постоянно, а после его обработки.
Алгоритм работы обработчика:
- Происходит подключение к IBM MQ.
- Ожидается сообщение.
- Когда сообщение получено, из него достается чанк, информация о файле и чанке, информация о переданном филиале.
- Если это первый загруженный чанк из файла, то создается пустой файл во временном хранилище сервиса асинхронной загрузки.
- Чанк записывается в файл во временном хранилище сервиса в соответствии с переданным значением смещения от начала файла.
- Если выполняется условие обновления значения прогресса, значение прогресса обновляется.
-
Если размер загруженного файла достиг размера, указанного при регистрации:
7.1. Сверяется хэш файла с тем, который был указан при регистрации файла. Если хэш не совпадает, то статус файла в сервисе меняется на Ошибка.
7.2. Статус файла в сервисе меняется на Завершение.
-
Если файл загружен полностью:
8.1. Сверяется хэш файла с тем, который был указан при регистрации файла.
8.2. Файл из временного хранилища сервиса загружается в Хранилище контента.
8.3. Статус файла на Сервере контента меняется на Активный.
8.4. Статус файла в сервисе меняется на Загружен.
