Проект "Интеграция с Региональной витриной данных (РВД)"
Для интеграции с Региональной витриной данных был выделен отдельный пакет для использования его компонентов в различных продуктах.
На текущий момент интеграция реализуется в рамках проектов Электронный детский сад (ЭДС), Электронная школа (ЭШ) и Электронный колледж (ЭК).
Описание концепции
Со стороны Минцифры предоставляется спецификация (ЕФТТ) с требованиями по формату и механизму выгрузки данных.
Выбрана модель промежуточного хранения данных на стороне продукта, которые подлежат выгрузке. При помощи такого подхода, можно обеспечить формирование не хранящихся в продукте данных и дальнейшее их обновление и удаление. Упрощается процесс поиска ошибок в данных, т.к. можно явно определить, в каких записях находятся ошибки и далее анализировать существующие данные в продуктах или функционал по формированию данных.
Принцип работы
Весь процесс разделен на сбор, выгрузку данных в файлы, отправку файлов. Выделяются следующие понятия:
Модель продукта : Django-модель находящаяся в самом продукте. При помощи нее производится накапливание пользовательских данных;
Модель РВД : Django-модель находящаяся в пакете РВД продукта. Из моделей РВД формируется схема БД, позволяющая хранить данные для дальнейшей выгрузки в нормализованном виде;
Сущность РВД : Описание формата выгрузки данных в РВД в виде dataclass-а. Хранит в себе описание первичных, внешних ключей, обязательность и порядок полей.
На этапе сбора данных производится формирование данных моделей РВД на основе данных моделей продуктов. Существуют так называемые расчетные модели, для которых данные рассчитываются в процессе сбора.
Стоит обратить внимание, что сущности РВД могут содержать в себе данные из нескольких моделей РВД.
Очереди для периодических задач сборки и выгрузки данных : Важно учитывать, что с версии пакета 3.6 вводится две новые очереди и соответствущие этим очередям периодические задачи сбора и выгрузки данных. Очередь для сущности указывается в реестре "Сущности для сбора и экспорта данных" - по умолчанию все сущности относятся к основной очереди. Итого - нужно настроить три очереди для работы.
- "Быстрая" очередь - RDM_FAST - для сущностей, по которым данные должны отдаваться каждые 5/10/15 минут по требованиям витрины. Периодическая задача - TransferLatestEntitiesDataFastPeriodicTask.
- Основная очередь (та которая была до версии 3.6) - RDM- ля всех сущностей по умолчанию. Периодическая задача - TransferLatestEntitiesDataFastPeriodicTask.
- "Долгая" очередь - RDM_LONG - для сущностей по которым идет долгий сбор, например для расчетных сущностей. Периодическая задача - TransferLatestEntitiesDataLongPeriodicTask.
Требования к окружению
Для работы требуется Python >=3.9. Так же в зависимостях есть внутренние пакеты:
- educommon;
- function-tools;
- m3-db-utils;
- uploader-client.
Версии всех пакетов уточнены в файлах с зависимостями.
Разворачивание
Перед внедрением пакета в проект, необходимо убедиться, что:
- В проекте используется логирование из educommon;
- В проект внедрен function-tools;
- В проект внедрен m3-db-utils;
- В проект внедрен uploader-client.
Подключение в settings.py
INSTALLED_APPS = ( ... 'edu_rdm_integration', 'edu_rdm_integration.collect_and_export_data', 'edu_rdm_integration.core.registry', 'edu_rdm_integration.rdm_entities', 'edu_rdm_integration.rdm_models', 'edu_rdm_integration.pipelines.cleanup_outdated_data', 'edu_rdm_integration.pipelines.transfer', 'edu_rdm_integration.stages.collect_data', 'edu_rdm_integration.stages.export_data', 'edu_rdm_integration.stages.service', 'edu_rdm_integration.stages.upload_data', 'edu_rdm_integration.stages.upload_data.uploader_log', 'edu_rdm_integration.stages.collect_data.registry', 'edu_rdm_integration.stages.export_data.registry', ... )
Подключение РВД к отдельной БД
При подключении отдельной БД для РВД необходимо:
-
Добавить в конфигурационный файл проекта следующие настройки: [rdm_general] USE_RDM_DB = True
[rdm_database] ENGINE = django.db.backends.postgresql_psycopg2 NAME = db_name USER = username PASSWORD = password HOST = 192.127.0.1 PORT = 5432
-
В настройках продукта в DATABASE_ROUTERS добавить 'edu_rdm_integration.routers.RdmRouter' или его наследника. Учитывая, что роутер сервисной БД должен быть последним.
-
В настройках продукта в DATABASES добавить настройки БД РВД, указав RDM_DB_ALIAS в качестве псевдонима БД со значением "rdm".
-
В настройках продукта необходимо добавить вычисляемую настройку "USING_RDM_DB_NAME". Например: USE_RDM_DB = conf.get_bool('rdm_general', 'USE_RDM_DB') USING_RDM_DB_NAME = RDM_DB_ALIAS if USE_RDM_DB else DEFAULT_DB_ALIAS 5.Применить миграции к новой БД командой "django-admin migrate --database=rdm"
Параметры конфигурационного файла
В разных проектах существуют различные способы добавления настроек, где-то через плагины, где-то напрямую в settings.py. Будет рассмотрен подход указания настроек в settings.py и указания параметров в конфигурационном файле.
Для возможности конфигурирования необходимо проделать ряд действий:
-
Определение значений по умолчанию настроек в settings.py:
PROJECT_DEFAULT_CONFIG.update({ # Настройки РВД ('rdm_general', 'EXPORT_ENTITY_ID_PREFIX'): '', # Дефолтное значение нужно изменить на специфическое системе ('rdm_general', 'COLLECT_CHUNK_SIZE'): 500, ('rdm_general', 'EXPORT_CHUNK_SIZE'): 500, ('rdm_general', 'COLLECT_CHUNKS_LIMIT'): 0, ('rdm_general', 'EXPORT_CHUNKS_LIMIT'): 0, ('rdm_general', 'UPLOAD_QUEUE_MAX_SIZE'): 500_000_000, ('rdm_general', 'RDM_MENU_ITEM'): False, ('rdm_general', 'COLLECT_PROGRESS_BATCH_SIZE'): 10000, ('rdm_general', 'USE_RDM_DB'): False, ('rdm_transfer_task', 'MINUTE'): '0', ('rdm_transfer_task', 'HOUR'): '*/4', ('rdm_transfer_task', 'DAY_OF_WEEK'): '*', ('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS'): 21600, ('rdm_transfer_task', 'NEXT_TASK_DELAY_SECONDS'): 5, ('rdm_transfer_task_fast', 'MINUTE'): '*/5', ('rdm_transfer_task_fast', 'HOUR'): '*', ('rdm_transfer_task_fast', 'DAY_OF_WEEK'): '*', ('rdm_transfer_task_fast', 'LOCK_EXPIRE_SECONDS'): 1800, ('rdm_transfer_task_fast', 'NEXT_TASK_DELAY_SECONDS'): 5, ('rdm_transfer_task_long', 'MINUTE'): '0', ('rdm_transfer_task_long', 'HOUR'): '*/6', ('rdm_transfer_task_long', 'DAY_OF_WEEK'): '*', ('rdm_transfer_task_long', 'LOCK_EXPIRE_SECONDS'): 28800, ('rdm_transfer_task_long', 'NEXT_TASK_DELAY_SECONDS'): 5, ('rdm_upload_data_task', 'MINUTE'): '0', ('rdm_upload_data_task', 'HOUR'): '*/2', ('rdm_upload_data_task', 'DAY_OF_WEEK'): '*', ('rdm_upload_data_task', 'LOCK_EXPIRE_SECONDS'): 7200, ('rdm_upload_data_task', 'EXPORT_STAGES'): 500, ('rdm_upload_data_task', 'STATUS_REQUEST_PERIOD_CHECK'): 30, ('rdm_upload_status_task', 'MINUTE'): '*/30', ('rdm_upload_status_task', 'HOUR'): '*', ('rdm_upload_status_task', 'DAY_OF_WEEK'): '*', ('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS'): 7200, ('rdm_check_suspend_task', 'MINUTE'): '*/10', ('rdm_check_suspend_task', 'HOUR'): '*', ('rdm_check_suspend_task', 'DAY_OF_WEEK'): '*', ('rdm_check_suspend_task', 'LOCK_EXPIRE_SECONDS'): 7200, ('rdm_check_suspend_task', 'STAGE_TIMEOUT'): 120, # Настройки очереди отправки ('rdm_redis', 'REDIS_HOST'): 'localhost', ('rdm_redis', 'REDIS_PORT'): 6379, ('rdm_redis', 'REDIS_DB'): 1, ('rdm_redis', 'REDIS_PASSWORD'): '', ('rdm_redis', 'REDIS_CACHE_TIMEOUT_SECONDS'): 7200, ('uploader_client', 'URL'): 'http://localhost:8090', ('uploader_client', 'DATAMART_NAME'): '', ('uploader_client', 'REQUEST_RETRIES'): 10, ('uploader_client', 'REQUEST_TIMEOUT'): 10, ('uploader_client', 'ENABLE_REQUEST_EMULATION'): False, ('uploader_client', 'RESPONSE_FILE_STATUS'): 'success', ('uploader_client', 'USE_PROXY_API'): False, ('uploader_client', 'USERNAME'): '', ('uploader_client', 'PASSWORD'): '', ('uploader_client', 'ORGANIZATION_OGRN'): '', ('uploader_client', 'INSTALLATION_NAME'): '', ('uploader_client', 'INSTALLATION_ID'): '', ('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_MODELS_OUTDATED_DATA'): False, ('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_SERVICE_OUTDATED_DATA'): False, ('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE'): 10000, ('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE'): 10, ('rdm_database', 'ENGINE'): 'django.db.backends.postgresql_psycopg2', ('rdm_database', 'NAME'): 'db_name', ('rdm_database', 'USER'): 'username', ('rdm_database', 'PASSWORD'): 'password', ('rdm_database', 'HOST'): '127.0.0.1', ('rdm_database', 'PORT'): '', }) -
Получение значений настроек из конфигурационного файла в settings.py:
# Ссылка на каталог с файлами для загрузки UPLOADS = 'uploads' # ============================================================================= # Интеграция с Региональной витриной данных (РВД) # ============================================================================= # Префикс идентификаторов записей сущностей специфический для продукта RDM_EXPORT_ENTITY_ID_PREFIX = conf.get('rdm_general', 'EXPORT_ENTITY_ID_PREFIX') # Количество записей моделей ЭШ обрабатываемых за одну итерацию сбора данных RDM_COLLECT_CHUNK_SIZE = conf.get_int('rdm_general', 'COLLECT_CHUNK_SIZE') # Количество записей моделей обрабатываемых за одну итерацию экспорта данных RDM_EXPORT_CHUNK_SIZE = conf.get_int('rdm_general', 'EXPORT_CHUNK_SIZE') # Для тестирования. Лимит обрабатываемых чанков при сборе RDM_COLLECT_CHUNKS_LIMIT = conf.get_int('rdm_general', 'COLLECT_CHUNKS_LIMIT') # Для тестирования. Лимит обрабатываемых чанков при экспорте RDM_EXPORT_CHUNKS_LIMIT = conf.get_int('rdm_general', 'EXPORT_CHUNKS_LIMIT') # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE = conf.get_int('rdm_general', 'UPDATE_NON_EXPORTED_CHUNK_SIZE') # Объем очереди файлов в витрину (в байтах) - по умолчанию 512 Мбайт RDM_UPLOAD_QUEUE_MAX_SIZE = conf.get_int('rdm_general', 'UPLOAD_QUEUE_MAX_SIZE') # Пункт меню "Региональная витрина данных" - Спрятать (False) / Отображать (True) RDM_MENU_ITEM = conf.get_bool('rdm_general', 'RDM_MENU_ITEM') # Размер батча для bulk_create операций при сборе данных РВД. RDM_COLLECT_PROGRESS_BATCH_SIZE = conf.get_int('rmd_general', 'COLLECT_PROGRESS_BATCH_SIZE') # Использование отдельной БД для РВД USE_RDM_DB = conf.get_bool('rdm_general', 'USE_RDM_DB') USING_RDM_DB_NAME = RDM_DB_ALIAS if USE_RDM_DB else DEFAULT_DB_ALIAS # Настройка запуска периодической задачи выгрузки данных: RDM_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task', 'MINUTE') RDM_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task', 'HOUR') RDM_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task', 'DAY_OF_WEEK') RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_transfer_task', 'LOCK_EXPIRE_SECONDS') RDM_TRANSFER_TASK_NEXT_TASK_DELAY_SECONDS = conf.get_int('rdm_transfer_task', 'NEXT_TASK_DELAY_SECONDS') # Настройка запуска периодической задачи выгрузки данных - быстрая очередь: RDM_FAST_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task_fast', 'MINUTE') RDM_FAST_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task_fast', 'HOUR') RDM_FAST_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task_fast', 'DAY_OF_WEEK') RDM_FAST_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_transfer_task_fast', 'LOCK_EXPIRE_SECONDS') RDM_FAST_TRANSFER_TASK_NEXT_TASK_DELAY_SECONDS = conf.get_int('rdm_transfer_task_fast', 'NEXT_TASK_DELAY_SECONDS') # Настройка запуска периодической задачи выгрузки данных - долгая очередь расчетных моделей: RDM_LONG_TRANSFER_TASK_MINUTE = conf.get('rdm_transfer_task_long', 'MINUTE') RDM_LONG_TRANSFER_TASK_HOUR = conf.get('rdm_transfer_task_long', 'HOUR') RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK = conf.get('rdm_transfer_task_long', 'DAY_OF_WEEK') RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_transfer_task_long', 'LOCK_EXPIRE_SECONDS') RDM_LONG_TRANSFER_TASK_NEXT_TASK_DELAY_SECONDS = conf.get_int('rdm_transfer_task_long', 'NEXT_TASK_DELAY_SECONDS') # Настройка запуска периодической задачи поиска зависших этапов экспорта: RDM_CHECK_SUSPEND_TASK_MINUTE = conf.get('rdm_check_suspend_task', 'MINUTE') RDM_CHECK_SUSPEND_TASK_HOUR = conf.get('rdm_check_suspend_task', 'HOUR') RDM_CHECK_SUSPEND_TASK_DAY_OF_WEEK = conf.get('rdm_check_suspend_task', 'DAY_OF_WEEK') RDM_CHECK_SUSPEND_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_check_suspend_task', 'LOCK_EXPIRE_SECONDS') RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT = conf.get_int('rdm_check_suspend_task', 'STAGE_TIMEOUT') # Настройка запуска периодической задачи отправки файлов с данными РВД RDM_UPLOAD_DATA_TASK_MINUTE = conf.get('rdm_upload_data_task', 'MINUTE') RDM_UPLOAD_DATA_TASK_HOUR = conf.get('rdm_upload_data_task', 'HOUR') RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK = conf.get('rdm_upload_data_task', 'DAY_OF_WEEK') RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_upload_data_task', 'LOCK_EXPIRE_SECONDS') # Количество подэтапов для обработки в периодической задаче отправки данных RDM_UPLOAD_DATA_TASK_EXPORT_STAGES = conf.get_int('rdm_upload_data_task', 'EXPORT_STAGES') # Период проверки статуса запроса, в минутах. Время, спустя которое происходит следующая проверка статуса. RDM_UPLOAD_DATA_TASK_STATUS_REQUEST_PERIOD_CHECK = conf.get_int('rdm_upload_data_task', 'STATUS_REQUEST_PERIOD_CHECK') # Настройка запуска периодической задачи статуса загрузки данных в витрину: RDM_UPLOAD_STATUS_TASK_MINUTE = conf.get('rdm_upload_status_task', 'MINUTE') RDM_UPLOAD_STATUS_TASK_HOUR = conf.get('rdm_upload_status_task', 'HOUR') RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK = conf.get('rdm_upload_status_task', 'DAY_OF_WEEK') RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS = conf.get_int('rdm_upload_status_task', 'LOCK_EXPIRE_SECONDS') # Настройка очереди Redis для формирования файлов РВД. RDM_REDIS_HOST = conf.get('rdm_redis', 'REDIS_HOST') RDM_REDIS_PORT = conf.get('rdm_redis', 'REDIS_PORT') RDM_REDIS_DB = conf.get('rdm_redis', 'REDIS_DB') RDM_REDIS_PASSWORD = conf.get('rdm_redis', 'REDIS_PASSWORD') # Таймаут для сохранения параметров в общем кеш. RDM_REDIS_CACHE_TIMEOUT_SECONDS = conf.get_int('rdm_redis', 'REDIS_CACHE_TIMEOUT_SECONDS') # Загрузка данных в Региональную витрину данных (РВД) # Адрес витрины (schema://host:port) RDM_UPLOADER_CLIENT_URL = conf.get('uploader_client', 'URL') # Мнемоника Витрины RDM_UPLOADER_CLIENT_DATAMART_NAME = conf.get('uploader_client', 'DATAMART_NAME') # Количество повторных попыток запроса RDM_UPLOADER_CLIENT_REQUEST_RETRIES = conf.get_int('uploader_client', 'REQUEST_RETRIES') # Таймаут запроса, сек RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT = conf.get_int('uploader_client', 'REQUEST_TIMEOUT') # Включить эмуляцию отправки запросов RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION = conf.get_bool('uploader_client', 'ENABLE_REQUEST_EMULATION') # Установить тип ответа витрины при проверке статуса отправленного файла RDM_RESPONSE_FILE_STATUS = conf.get('uploader_client', 'RESPONSE_FILE_STATUS') # Использование Proxy API RDM_UPLOADER_CLIENT_USE_PROXY_API = conf.get_bool('uploader_client', 'USE_PROXY_API') # Имя пользователя IAM RDM_UPLOADER_CLIENT_USERNAME = conf.get('uploader_client', 'USERNAME') # Пароль пользователя IAM RDM_UPLOADER_CLIENT_PASSWORD = conf.get('uploader_client', 'PASSWORD') # ОГРН организации, в рамках которой развёрнута Витрина RDM_UPLOADER_CLIENT_ORGANIZATION_OGRN = conf.get('uploader_client', 'ORGANIZATION_OGRN') # Имя инсталляции в целевой Витрине RDM_UPLOADER_CLIENT_INSTALLATION_NAME = conf.get('uploader_client', 'INSTALLATION_NAME') # Идентификатор инсталляции в целевой Витрине RDM_UPLOADER_CLIENT_INSTALLATION_ID = conf.get('uploader_client', 'INSTALLATION_ID') # Директория логов сбора данных, доступных для скачивания RDM_COLLECT_LOG_DIR = os.path.join('logs', 'rdm', 'collect') os.makedirs(os.path.join(MEDIA_ROOT, RDM_COLLECT_LOG_DIR), exist_ok=True) # Директория логов экспорта данных, доступных для скачивания RDM_EXPORT_LOG_DIR = os.path.join('logs', 'rdm', 'export') os.makedirs(os.path.join(MEDIA_ROOT, RDM_EXPORT_LOG_DIR), exist_ok=True) # Директория логов отправки данных в витрину, доступных для скачивания RDM_UPLOAD_LOG_DIR = os.path.join('logs', 'rdm', 'upload') os.makedirs(os.path.join(MEDIA_ROOT, RDM_UPLOAD_LOG_DIR), exist_ok=True) # Включить зачистку устаревших данных моделей РВД RDM_ENABLE_CLEANUP_MODELS_OUTDATED_DATA = conf.get_bool('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_MODELS_OUTDATED_DATA') # Включить зачистку устаревших данных сервисных моделей РВД RDM_ENABLE_CLEANUP_SERVICE_OUTDATED_DATA = conf.get_bool('rdm_cleanup_outdated_data', 'ENABLE_CLEANUP_SERVICE_OUTDATED_DATA') # Размер чанка записей зачистки устаревших данных моделей РВД RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE') # Количество подключений к БД для зачистки устаревших данных моделей РВД RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = conf.get_int('rdm_cleanup_outdated_data', 'CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE')
Перечень настроек в settings.py указан в таблице ниже.
| Название настройки в settings | Описание | Значение по умолчанию |
|---|---|---|
| UPLOADS | Основная директория в MEDIA, в которой будет создана директория edu_rdm_integration для сохранения файлов для дальнейшей выгрузки | 500 |
| RDM_EXPORT_ENTITY_ID_PREFIX | Префикс идентификаторов записей сущностей специфический для продукта | |
| RDM_COLLECT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию сбора данных | 500 |
| RDM_EXPORT_CHUNK_SIZE | Количество записей моделей обрабатываемых за одну итерацию экспорта | 500 |
| RDM_COLLECT_CHUNKS_LIMIT | Для тестирования. Лимит обрабатываемых чанков при сборе и включенном DEBUG=True | 0 |
| RDM_EXPORT_CHUNKS_LIMIT | Для тестирования. Лимит обрабатываемых чанков при экспорте и включенном DEBUG=True | 0 |
| RDM_UPDATE_NON_EXPORTED_CHUNK_SIZE | # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified | 5000 |
| RDM_UPLOAD_QUEUE_MAX_SIZE | Объем очереди файлов в витрину (в байтах). | 500_000_000 |
| RDM_MENU_ITEM | Отображение пункта меню Пункт меню "Региональная витрина данных" | False |
| RDM_COLLECT_PROGRESS_BATCH_SIZE | Размер батча для сохранений записей в базу при сборе данных РВД | 10000 |
| USE_RDM_DB | Использование отдельной БД для РВД | False |
| RDM_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи выгрузки данных. Минута | '0' |
| RDM_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи выгрузки данных. Час | '*/4' |
| RDM_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи выгрузки данных. День недели | '*' |
| RDM_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 21600 |
| RDM_FAST_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. Минута | '*/5' |
| RDM_FAST_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. Час | '*' |
| RDM_FAST_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи (быстрая очередь) выгрузки данных. День недели | '*' |
| RDM_FAST_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 1800 |
| RDM_LONG_TRANSFER_TASK_MINUTE | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. Минута | 0 |
| RDM_LONG_TRANSFER_TASK_HOUR | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. Час | '*/6' |
| RDM_LONG_TRANSFER_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи (долгая очередь) выгрузки данных. День недели | '*' |
| RDM_LONG_TRANSFER_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 28800 |
| RDM_CHECK_SUSPEND_TASK_MINUTE | Настройка запуска периодической задачи поиска зависших этапов экспорта. Минута | */10 |
| RDM_CHECK_SUSPEND_TASK_HOUR | Настройка запуска периодической задачи поиска зависших этапов экспорта. Час | * |
| RDM_CHECK_SUSPEND_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи поиска зависших этапов экспорта. День недели | * |
| RDM_CHECK_SUSPEND_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах). | 7200 |
| RDM_CHECK_SUSPEND_TASK_STAGE_TIMEOUT | Дельта для определения зависшего подэтапа. Минута | 120 |
| RDM_UPLOAD_DATA_TASK_MINUTE | Настройка запуска периодической задачи отправки файлов с данными РВД (минута). | '0' |
| RDM_UPLOAD_DATA_TASK_HOUR | Настройка запуска периодической задачи отправки файлов с данными РВД (час). | '*/2' |
| RDM_UPLOAD_DATA_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи отправки файлов с данными РВД (день недели). | '*' |
| RDM_UPLOAD_DATA_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах). | 7200 |
| RDM_UPLOAD_DATA_TASK_EXPORT_STAGES | Количество подэтапов для обработки в периодической задаче отправки данных. | 500 |
| RDM_UPLOAD_STATUS_TASK_MINUTE | Настройка запуска периодической задачи статуса загрузки данных в витрину. Минута | '*/30' |
| RDM_UPLOAD_STATUS_TASK_HOUR | Настройка запуска периодической задачи статуса загрузки данных в витрину. Час | '*' |
| RDM_UPLOAD_STATUS_TASK_DAY_OF_WEEK | Настройка запуска периодической задачи статуса загрузки данных в витрину. День недели | '*' |
| RDM_UPLOAD_STATUS_TASK_LOCK_EXPIRE_SECONDS | Время по истечении которого, блокировка может быть снята (в секундах) | 3600 |
| RDM_REDIS_HOST | Настройка очереди Redis для формирования файлов РВД (хост). | |
| RDM_REDIS_PORT | Настройка очереди Redis для формирования файлов РВД (порт). | |
| RDM_REDIS_DB | Настройка очереди Redis для формирования файлов РВД (номер бд). | |
| RDM_REDIS_PASSWORD | Настройка очереди Redis для формирования файлов РВД (пароль). | |
| RDM_REDIS_CACHE_TIMEOUT_SECONDS | Таймаут для сохранения параметров в общем кеш (секунды). | 7200 |
| RDM_UPLOADER_CLIENT_URL | Адрес витрины (schema://host:port) | 'http://localhost:8090' |
| RDM_UPLOADER_CLIENT_DATAMART_NAME | Мнемоника Витрины | 'test' |
| RDM_UPLOADER_CLIENT_REQUEST_RETRIES | Количество повторных попыток запроса | 10 |
| RDM_UPLOADER_CLIENT_REQUEST_TIMEOUT | Таймаут запроса, сек | 10 |
| RDM_UPLOADER_CLIENT_ENABLE_REQUEST_EMULATION | Включить эмуляцию отправки запросов | True |
| RDM_RESPONSE_FILE_STATUS | Установить тип ответа витрины при проверке статуса отправленного файла | 'success' |
| RDM_UPLOADER_CLIENT_USE_PROXY_API | Использование Proxy API | False |
| RDM_UPLOADER_CLIENT_USERNAME | Имя пользователя IAM | |
| RDM_UPLOADER_CLIENT_PASSWORD | Пароль пользователя IAM | |
| RDM_UPLOADER_CLIENT_ORGANIZATION_OGRN | ОГРН организации, в рамках которой развёрнута Витрина | |
| RDM_UPLOADER_CLIENT_INSTALLATION_NAME | Имя инсталляции в целевой Витрине | |
| RDM_UPLOADER_CLIENT_INSTALLATION_ID | Идентификатор инсталляции в целевой Витрине | |
| RDM_COLLECT_LOG_DIR | Директория логов сбора данных, доступных для скачивания | |
| RDM_EXPORT_LOG_DIR | Директория логов экспорта данных, доступных для скачивания | |
| RDM_UPLOAD_LOG_DIR | Директория логов отправки данных в витрину, доступных для скачивания | |
| RDM_ENABLE_CLEANUP_MODELS_OUTDATED_DATA | Включение зачистки устаревших данных моделей РВД | False |
| RDM_ENABLE_CLEANUP_SERVICE_OUTDATED_DATA | Включение зачистки устаревших данных сервисных моделей РВД | False |
| RDM_CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE | Размер чанка записей зачистки устаревших данных моделей РВД | 10000 |
| RDM_CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE | Количество подключений к БД для зачистки устаревших данных моделей РВД | 10 |
-
В дефолтный конфиг проекта необходимо добавить:
# Общие настройки интеграции с РВД [rdm_general] # Префикс идентификаторов записей сущностей специфический для продукта. Указывается в settings.py и не должен # изменяться. Возможность изменения через конфигурационный файл оставлена для экстренных случаев. # EXPORT_ENTITY_ID_PREFIX = # Количество записей моделей обрабатываемых за одну итерацию экспорта данных EXPORT_CHUNK_SIZE = 500 # Количество записей моделей ЭШ обрабатываемых за одну итерацию сбора данных COLLECT_CHUNK_SIZE = 500 # Для тестирования. Лимит обрабатываемых чанков при сборе и включенном DEBUG=True COLLECT_CHUNKS_LIMIT = 0 # Для тестирования. Лимит обрабатываемых чанков при экспорте и включенном DEBUG=True EXPORT_CHUNKS_LIMIT = 0 # Размер батча для bulk_create операций при сборе данных РВД COLLECT_PROGRESS_BATCH_SIZE = 10000 # Количество не экспортированных записей моделей обрабатываемых за одну итерацию обновления поля modified UPDATE_NON_EXPORTED_CHUNK_SIZE = 5000 # Объем очереди файлов в витрину (в байтах) - по умолчанию 512 Мбайт. UPLOAD_QUEUE_MAX_SIZE = 500000000 # Отображение пункта меню "Региональная витрина данных" RDM_MENU_ITEM = False # Настройка запуска периодической задачи выгрузки данных [rdm_transfer_task] MINUTE=*/2 HOUR=* DAY_OF_WEEK=* LOCK_EXPIRE_SECONDS=21600 [rdm_transfer_task_fast] MINUTE=*/2 HOUR=* DAY_OF_WEEK=* LOCK_EXPIRE_SECONDS = 1800 [rdm_transfer_task_long] MINUTE=*/15 HOUR=* DAY_OF_WEEK=* LOCK_EXPIRE_SECONDS = 21600 # Настройка запуска периодической задачи поиска зависших этапов экспорта [rdm_check_suspend_task] MINUTE=*/10 HOUR=* DAY_OF_WEEK=* LOCK_EXPIRE_SECONDS=7200 # Дельта для определения зависшего подэтапа, мин STAGE_TIMEOUT=120 # Настройка запуска периодической задачи отправки csv-файлов в витрину. [rdm_upload_data_task] MINUTE=*/2 HOUR=* DAY_OF_WEEK=* LOCK_EXPIRE_SECONDS = 7200 EXPORT_STAGES = 500 # Настройка запуска периодической задачи статуса загрузки данных в витрину [rdm_upload_status_task] MINUTE=*/2 HOUR=* DAY_OF_WEEK=* LOCK_EXPIRE_SECONDS=7200 # Настройка очереди Redis для формирования файлов РВД. [rdm_redis] REDIS_HOST = localhost REDIS_PORT = 6379 REDIS_DB = 1 REDIS_PASSWORD = # Таймаут для сохранения параметров в общем кеш. REDIS_CACHE_TIMEOUT_SECONDS = 7200 [uploader_client] # Адрес витрины URL = http://localhost:8090 # Мнемоника Витрины DATAMART_NAME = test # Количество повторных попыток запроса REQUEST_RETRIES = 10 # Таймаут запроса, сек REQUEST_TIMEOUT = 10 # Включить эмуляцию отправки запросов ENABLE_REQUEST_EMULATION = True # Использовать Proxy API USE_PROXY_API = False # Имя пользователя IAM USERNAME = # Пароль пользователя IAM PASSWORD = # ОГРН организации, в рамках которой развёрнута Витрина ORGANIZATION_OGRN = # Имя инсталляции в целевой Витрине INSTALLATION_NAME = # Идентификатор инсталляции в целевой Витрине INSTALLATION_ID = # Настройка зачистки устаревших данных [rdm_cleanup_outdated_data] # Включить зачистку устаревших данных моделей РВД ENABLE_CLEANUP_MODELS_OUTDATED_DATA = False # Включить зачистку устаревших данных сервисных моделей РВД ENABLE_CLEANUP_SERVICE_OUTDATED_DATA = False # Размер чанка записей проверки устаревших данных моделей РВД CLEANUP_MODELS_OUTDATED_DATA_CHUNK_SIZE = 10000 # Количество подключений к БД для проверки устаревших данных моделей РВД CLEANUP_MODELS_OUTDATED_DATA_POOL_SIZE = 10 # Настройка отдельной БД для РВД. Работает при включенной настройке USE_RDM_DB = True [rdm_database] ENGINE = django.db.backends.postgresql_psycopg2 NAME = db_name USER = username PASSWORD = password HOST = 127.0.0.1 PORT = 5432
На основе дефолтного конфига произвести конфигурирование приложений.
Форматирование
Форматирование исходного кода осуществляется при помощи ruff. Ниже приведены команды для осуществления форматирования.
$ ruff format src/
$ ruff check --fix --unsafe-fixes src/
Сборка и распространение
Сборка пакета производится при помощи Job-а в Jenkins M3.build_dist.
Пакет выкладывается в глобальный PYPI и во внутренний Nexus
Документация
С документацией можно ознакомиться по ссылке http://docs.py.bars.group/edu-rdm-integration/
Metadata
Release files for edu-rdm-integration 3.28.10
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| edu_rdm_integration-3.28.10.tar.gz | 206.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| edu_rdm_integration-3.28.10-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 498.1 kB
Release files / edu_rdm_integration-3.28.10.tar.gz
| Download URL | edu_rdm_integration-3.28.10.tar.gz |
|---|---|
| Size | 206.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8bf472377c5ff212758c490035b90e67935635a7f4806c6c5131157884ff2019
|
|
BLAKE2b-256 checksum How to use checksums |
9e7e2bd4c44f1df9186759afe5716f969583501cf697b81711e94e91411eaaeb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.23
|
Release files / edu_rdm_integration-3.28.10-py3-none-any.whl
| Download URL | edu_rdm_integration-3.28.10-py3-none-any.whl |
|---|---|
| Size | 291.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9d130346b586a6b4f7639955603a442e2c04eb27f778c077dbf9f1c3bca201ed
|
|
BLAKE2b-256 checksum How to use checksums |
dda81e040c452a7ab5811a6f740e5a3f28bfe5fdb41da8b6e077d7a13c6e7f6d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.23
|