Архивация крупномасштабных API: опыт работы с государственными системами
Практический опыт использования APIBackuper для архивации больших объёмов данных из государственных API, включая портал Электронный бюджет и другие системы.
Задача
Необходимо было заархивировать данные из крупных государственных API:
- Портал Электронный бюджет — миллионы записей о бюджетных данных
- Портал открытых данных — тысячи наборов данных
- Реестры государственных услуг — структурированные данные о госуслугах
Каждый API содержал сотни тысяч или миллионы записей, требовал особого подхода к rate limiting и управлению хранилищем.
Вызовы масштабирования
Объёмы данных
- Миллионы записей: Некоторые API содержали более 10 миллионов записей
- Терабайты данных: Общий объём мог достига ть нескольких терабайт
- Время выполнения: Архивация могла занимать дни или недели
Технические ограничения
- Rate limiting: API ограничивали количество запросов
- Таймауты: Длительные операции могли прерываться
- Хранилище: Требовалось управление большими объёмами данных
- Надёжность: Процесс должен был выдерживать сбои
Операционные сложности
- Необходимость мониторинга длительных процессов
- Обработка ошибок и повторные попытки
- Управление версиями данных
- Проверка целостности
Решение: APIBackuper для масштабных проектов
Пример: Портал Электронный бюджет
Анализ API
Сначала был проанализирован API:
# Проверка доступности
curl "https://budget.gov.ru/epbs/registry/7710568760-BUDGET/data?page=1&per_page=10"
# Оценка общего количества записей
curl "https://budget.gov.ru/epbs/registry/7710568760-BUDGET/data?page=1&per_page=1" | jq '.total'
Конфигурация APIBackuper
project:
name: budget-portal-2023
storage:
type: zip
file: budget_data_2023.zip
compression: deflate
chunk_size: 1000000 # 1 миллион записей на файл
request:
url: "https://budget.gov.ru/epbs/registry/7710568760-BUDGET/data"
method: GET
params:
page: 1
per_page: 100
iterator:
param: page
start: 1
step: 1
max_pages: 100000 # Защита от бесконечного цикла
rate_limit:
enabled: true
requests_per_second: 3 # Консервативный лимит
burst: 5
backoff:
enabled: true
factor: 2
max_delay: 60
error_handling:
retries: 5
retry_delay: 10
skip_errors: false
error_codes: [429, 500, 502, 503, 504]
continue_on_error: true
logging:
level: INFO
file: budget_archive.log
progress_interval: 1000 # Логировать каждые 1000 записей
Запуск и мониторинг
# 1. Оценка объёма данных
apibackuper estimate full -p budget-portal-2023
# Результат оценки:
# Estimated records: 8,543,210
# Estimated size: ~45 GB
# Estimated time: ~78 hours
# 2. Запуск архивации
apibackuper run full -p budget-portal-2023
# 3. Мониторинг прогресса (в отдельном терминале)
tail -f budget-portal-2023/budget_archive.log
Стратегия обработки больших объёмов
Разбиение на части:
# Архивация по годам
for year in 2020 2021 2022 2023; do
# Обновляем конфигурацию для конкретного года
sed -i "s/date_filter:.*/date_filter: $year/" config.yaml
# Запускаем архивацию
apibackuper run full -p budget-portal-$year
# Проверяем результат
apibackuper verify -p budget-portal-$year
done
Инкрементальное обновление:
# Проверка новых данных
apibackuper estimate incremental -p budget-portal-2023 --since 2024-01-01
# Загрузка только новых записей
apibackuper run incremental -p budget-portal-2023 --since 2024-01-01
Управление хранилищем
Сжатие данных
storage:
type: zip
compression: deflate
compression_level: 6 # Баланс между скоростью и размером
Разбиение на части
storage:
type: zip
chunk_size: 1000000 # Новый файл каждые 1M записей
naming: "budget_data_part_{chunk:04d}.zip"
Экспорт в разные форматы
После архивации данные можно экспортировать:
# Экспорт в JSONL для обработки
apibackuper export budget_data.jsonl -p budget-portal-2023
# Экспорт в Parquet для анализа
apibackuper export budget_data.parquet -p budget-portal-2023
# Экспорт в сжатый формат
apibackuper export budget_data.jsonl.gz -p budget-portal-2023
Оптимизация производительности
Параллельная обработка
processing:
threads: 4
batch_size: 1000
Кэширование
cache:
enabled: true
directory: "./cache"
ttl: 3600 # 1 час
Оптимизация запросов
request:
# Запрашивать только нужные поля
fields: ["id", "name", "date", "amount"]
# Использовать фильтры на стороне сервера
filters:
date_from: "2023-01-01"
date_to: "2023-12-31"
status: "active"
Результаты
Портал Электронный бюджет
- Записей заархивировано: 8,543,210
- Размер архива: 42.7 GB (сжато)
- Время выполнения: 76 часов
- Успешность: 99.97% (несколько записей были пропущены из-за ошибок API)
Портал открытых данных
- Наборов данных: 1,940
- Размер архива: 15.3 GB
- Время выполнения: 12 часов
- Успешность: 100%
Реестры государственных услуг
- Записей: 2,156,789
- Размер архива: 8.9 GB
- Время выполнения: 24 часа
- Успешность: 99.99%
Проблемы и решения
Проблема 1: Rate limiting
Симптомы: API возвращал ошибку 429 (Too Many Requests)
Решение:
rate_limit:
enabled: true
requests_per_second: 2 # Уменьшили до 2 запросов в секунду
backoff:
enabled: true
factor: 2
max_delay: 120
Проблема 2: Таймауты при больших ответах
Симптомы: Запросы прерывались по таймауту
Решение:
request:
timeout: 300 # Увеличили таймаут до 5 минут
retries: 3
retry_delay: 30
Проблема 3: Нехватка места на диске
Симптомы: Процесс останавливался из-за нехватки места
Решение:
- Использовали сжатие данных
- Разбивали архив на части
- Переносили готовые части на другое хранилище
Проблема 4: Долгие процессы
Симптомы: Процесс мог прерваться из-за сетевых сбоев
Решение:
resume:
enabled: true
checkpoint_file: "checkpoint.json"
checkpoint_interval: 10000 # Сохранять прогресс каждые 10K записей
Лучшие практики
Планирование
- Оценка перед запуском: Всегда используйте
estimateперед полной архивацией - Тестовый запуск: Начните с небольшого объёма (100-1000 записей)
- Мониторинг ресурсов: Следите за использованием диска и памяти
Конфигурация
- Консервативные лимиты: Начинайте с меньших значений rate limiting
- Обработка ошибок: Настройте retry и обработку ошибок
- Логирование: Включите подробное логирование
Мониторинг
- Про гресс: Регулярно проверяйте логи и прогресс
- Ошибки: Отслеживайте частоту ошибок
- Производительность: Мониторьте скорость загрузки
Хранение
- Сжатие: Используйте сжатие для экономии места
- Разбиение: Разбивайте большие архивы на части
- Проверка: Проверяйте целостность после архивации
Автоматизация
Скрипт для регулярной архивации
#!/bin/bash
# regular-api-backup.sh
PROJECT="budget-portal"
DATE=$(date +%Y%m%d)
# Проверка новых данных
NEW_RECORDS=$(apibackuper estimate incremental -p $PROJECT --since $(date -d "7 days ago" +%Y-%m-%d) | grep "records" | awk '{print $2}')
if [ "$NEW_RECORDS" -gt 0 ]; then
echo "Найдено $NEW_RECORDS новых записей. Запускаем архивацию..."
# Инкрементальная архивация
apibackuper run incremental -p $PROJECT --since $(date -d "7 days ago" +%Y-%m-%d)
# Экспорт новых данных
apibackuper export "budget_incremental_$DATE.jsonl" -p $PROJECT
echo "Архивация завершена"
else
echo "Новых записей не найдено"
fi
Мониторинг через cron
# Добавить в crontab для еженедельного запуска
0 2 * * 0 /path/to/regular-api-backup.sh >> /var/log/api-backup.log 2>&1
Выводы
- Масштабируемость: APIBackuper успешно справляется с миллионами записей
- Надёжность: Правильная настройка обеспечивает стабильную работу
- Гибкость: Конфигурация позволяет адаптироваться к разным API
- Автоматизация: Процесс можно полностью автоматизировать