Войти

REST-uploader - модуль асинхронной загрузки данных из сторонних источников

Общее описание

Модуль асинхронной загрузки данных из сторонних источников (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 Мб на один файл.

Авторизуйтесь, чтобы оставить комментарий к статье