Общее описание
Модуль асинхронной загрузки данных из сторонних источников (REST-uploader) предназначен для параллельной загрузки данных (в виде csv-файлов в кодировке UTF-8) с независимым масштабированием REST-интерфейса. Поступающие на загрузку данные буферизируются, а затем направляются менеджером дельт в базу с группировкой по витринам данных. Загрузка данных в витрину может выполняться с учетом форматно-логического контроля (ФЛК).
Функциональные особенности модуля:
- идентификатор запросов, передаваемый источнику, генерируется по стандарту UUID;
- метаданные от сервера витрины кешируются механизмом и проверяются на соответствие по количеству и по типам полей;
- загруженные данные размещаются вместе с UUID в очереди с именем «queue»;
- формируется запись с ключом «status.[UUID запроса]» и статусом 0 в очереди;
- клиенту, отправившему запрос, возвращается успешный статус запроса вместе с UUID;
- в логе приложения формируется запись события получения запроса на загрузку с указанием идентификатора запроса, идентификатора организации-владельца данных, времени обработки и размера загруженных данных.
Модуль устанавливается после настройки конфигурации в специальную директорию на сервере через SSH-консоль технологического пользователя.
Конфигурация модуля REST-uploader
Логика и порядок работы модуля задаются в конфигурационном файле application.yml. В частности, параметры конфигурации определяют асинхронную загрузку данных из источников, задают настройку подключения к ядру витрины и другие настройки, необходимые для корректной работы модуля.
В конфигурационном файле должны быть определены только те настройки, которые необходимы для решения конкретных бизнес-задач.
Изменение конфигурации модуля REST-uploader достигается путем редактирования параметров в файле application.yml.
Конфигурационные параметры задаются в соответствующих секциях файла application.yml:
- server – порт сервера;
- executor – размер пула для запросов;
- send – ограничения на размер загружаемого файла;
- environment – настройки окружения;
- conditions – включение форматно-логического контроля и поведение при обнаружении ошибок;
- zookeeper – настройки подключения к Zookeeper;
- prostore-api-client – блок параметров конфигурирования взаимодействия с ProStore. Если false – будет использоваться JDBC-драйвер;
- prostore – настройка подключения к серверу и базе данных ProStore;
- redis – настройка подключения к redis;
- auth – указывается секрет для валидации токенов;
- metrics – настройка получения метрик;
- scheduler – настройка таймаута отправки запроса в Redis;
- csv-parser – настройка парсинга CSV.
Пример файла application.yml для REST-uploader:
server:port: ${SERVER_PORT:8081} executor: reader-pool-size: ${EXECUTOR_READER_POOL_SIZE:20} send: file-size-restriction: ${SEND_FILE_SIZE_RESTRICTION:512} environment: # Название окружения name: ${ENVIRONMENT_NAME:test} conditions: # включение ФЛК и поведение при обнаружении ошибок mode: warning # период хранения журналов ошибок save-time: 1d # путь хранения журналов ошибок на общем диске: save-path: /tmp/rest-uploader/reports # путь к хранению правил в Zookeeper zookeeper-path: rest-uploader/conditions # таймаут обработки запроса. 0 - таймаут отключен rest-timeout: 60s # период жизни группы save_group_time: 1d validation: # таймаут выполнения асинхронной проверки validation-timeout: 1h # таймаут получения сообщений из redis poll-timeout: 30s # количество корутин асинхронной валидации max-concurrent-handle: 1 # размер порции вычитки сообщений из redis batch-size: 1 # признак выполнения проверки кодировки charset-check-enabled: true health-check: # период жизни флага активности timeout-active: 3m # период обновления статуса publish-period: 30s zookeeper: connect-string: ${ZOOKEEPER_DS_ADDRESS:localhost} connection-timeout-ms: ${ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000} session-timeout-ms: ${ZOOKEEPER_DS_SESSION_TIMEOUT_MS:40000} retry-count: 3 retry-base-sleep-time-ms: 1_000 namespace: ${ZOOKEEPER_DS_CHROOT:adapter}/${environment.name} prostore-rest-client:# Признак использования rest-api для взаимодействия с простором. Если false - будет использоваться jdbc драйвер enabled: ${PS_REST_CLIENT_ENABLED:true} host: ${PS_HOST:t5-prostore-01.ru-central1.internal} port: ${PS_PORT:9195} http: max-pool-size: ${PS_MAX_POOL_SIZE:8} prostore: subprotocol: ${PS_SUBPROTOCOL:prostore} driver: ${PS_DRIVER:ru.datamart.prostore.jdbc.Driver} host: ${PS_HOST:t5-prostore-01.ru-central1.internal} port: ${PS_PORT:9195} initialPoolSize: ${PS_INITIAL_POOL_SIZE:3} maxPoolSize: ${PS_MAX_POOL_SIZE:8} redis: type: ${REDIS_TYPE:STANDALONE} connection-string: ${REDIS_CONNECTION_STRING:redis://localhost:6379} password: ${REDIS_PASSWORD:eYVX7EwVmmxKPCDmwMtyKVge8oLd2t81} max-pool-size: ${REDIS_MAX_POOL_SIZE:6} max-pool-waiting: ${REDIS_MAX_POOL_WAITING:24} max-waiting-handlers: ${REDIS_MAX_WAITING_HANDLERS:32} auth: secret: ${AUTH_SECRET:gPHaT%ACXGQaQ30%1id%K7@C} enabled: ${AUTH_ENABLED:true} access-list-path: rest-uploader/ids metrics: port: ${METRICS_PORT:9837} scheduler: redis-check-request-timeout: ${REDIS_CHECK_REQUEST_TIMEOUT:60} csv-parser: separator: ${CSV_PARSER_SEPARATOR:;} quote-char: ${CSV_PARSER_QUOTE_CHAR:"} escape-char: ${CSV_PARSER_ESCAPE_CHAR:'} field-as-null: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS} |
Форматно-логический контроль
Форматно-логический контроль (ФЛК) включает в себя обязательные (блокирующие) проверки, выполняющиеся вне зависимости от настроек модуля в синхронном режиме, и необязательные проверки, выполняющиеся в асинхронном режиме, индивидуальные для каждой таблицы.
Ошибки обязательных проверок возвращаются в теле ответа по REST API.
Необязательные (асинхронные) проверки выполняются в зависимости от настроек модуля и не являются блокирующими, поведение при их наличии определяется конфигурацией модуля. Список таких проверок уникален для каждой таблицы и хранится в Zookeeper в виде отдельного yaml-файла.
К синхронным проверкам относятся:
- проверка соответствия информационной схеме:
- соответствие имен и количества полей в заголовках;
- тип данных;
- экранирование данных: соответствие числа столбцов по каждой строке;
- проверка соответствия файла кодировке UTF-8;
- проверка предельного размера загружаемого файла 512 Мб и наличия данных в файле.
К асинхронным проверкам относятся:
- проверка уникальности полей:
- по сочетанию атрибутов (для комплексных ключей);
- по заданному атрибуту;
- сравнение значения с константой;
- соответствие регулярному выражению.
Для одного поля возможно создать не более одной проверки одного типа, при этом у каждого поля может быть несколько проверок разных типов.
Если в конфигурационном файле указано условие mode: "skip_string", то в витрину данных загрузятся только строки, прошедшие проверку ФЛК. Строки, которые не прошли проверку, загружены не будут.
Спецификация модуля асинхронной загрузки данных из сторонних источников
В зависимости от операций, которые требуется выполнить, используются следующие методы обращений к REST-uploader:
POST |
v2/datamarts/{datamart_name}/tables/{table_name}/upload |
Загрузка данных в витрину с учетом выполнения ФЛК |
GET |
v2/requests/{request_id}/status |
Получение статуса запроса |
DELETE |
v2/datamarts/{datamart_name}/tables/{table_name}/delete |
Удаление данных из витрины |
POST |
v2/conditions/{datamart}/{table} |
запрос для загрузки списка правил для таблицы, для сохранения в Zookeeper |
PUT |
v2/conditions/{datamart}/{table} |
запрос для добавления правил для таблицы, для сохранения в Zookeeper |
GET |
v2/conditions/{datamart}/{table} |
запрос для получения списка проверок для таблицы, хранящийся в Zookeer |
DELETE |
v2/conditions/{datamart}/{table} |
запрос для удаления всего списка проверок по таблице |
GET |
v2/requests/{request_id}/report |
Возвращает отчет по форматно логическом контроле загружаемых данных в формате .csv |
GET |
v2/group/{group_id}/report |
Запрос возвращает отчет по комплектности группы загружаемых файлов в формате .csv |
Ограничения
Заливка данных в датамарты через модуль REST-uploader параллельно с заливкой данных с использованием других инструментов не предусмотрена: это приведет к конфликту в работе с дельтами и ошибкам.
Также следует учесть, что у приложения Redis есть ограничение в 512 Мб на объем загружаемых данных. Рекомендуемый объем загрузки – 200 Мб на один файл.