Files
mostovik-backend/docs/adr/ADR-013: Parser Stability Strategy.md
Aleksandr Meshchriakov 25176f31b4
Some checks failed
CI/CD Pipeline / Telegram Notify Success (push) Has been cancelled
CI/CD Pipeline / Run Tests (push) Has been cancelled
CI/CD Pipeline / Code Quality Checks (push) Has been cancelled
CI/CD Pipeline / Code Quality Checks (pull_request) Successful in 1m42s
CI/CD Pipeline / Run Tests (pull_request) Successful in 2m25s
CI/CD Pipeline / Telegram Notify Success (pull_request) Successful in 1m34s
fix pre-commit
2026-03-17 13:55:34 +01:00

119 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-013: Parser Stability and Source Change Detection for External Sources
## Status
Accepted
## Context
Система зависит от внешних источников данных, которые находятся вне зоны контроля команды:
- государственные порталы
- HTML-страницы
- JS-heavy интерфейсы
- файловые выгрузки
- SOAP/API интеграции
- Excel/XML источники
Эти источники подвержены изменениям:
- меняется DOM-структура
- меняются URL и маршруты
- меняются названия полей
- меняется формат выгрузки
- появляются новые обязательные поля
- меняются ограничения доступа
- изменяется поведение клиентского JavaScript
Для системы такого типа изменение внешнего источника является не исключением, а ожидаемым операционным событием.
## Decision
Проект принимает стратегию parser instability as expected.
Это означает:
- каждый внешний источник считается потенциально нестабильным
- отказ парсера по причине изменения источника рассматривается как ожидаемый класс инцидента
- архитектура должна облегчать локализацию, диагностику и восстановление интеграции
### Архитектурные правила
1. Каждый источник должен быть изолирован в собственном parser/client/service слое.
2. Логика получения данных из источника не должна быть размазана по нескольким доменам без явной границы.
3. Изменение одного источника не должно ломать остальные интеграции.
4. Парсер должен быть максимально отделён от логики сохранения данных.
5. Нормализация и запись в БД не должны зависеть от деталей DOM/HTML/XML конкретного источника.
### Change detection policy
Система должна позволять определить, что проблема вызвана именно изменением внешнего источника, а не внутренней ошибкой приложения.
Минимально необходимы:
- явное логирование этапа сбоя
- логирование URL, периода, типа выгрузки или источника
- различение сетевых ошибок, ошибок структуры ответа и ошибок сохранения
- сохранение диагностического контекста для повторного анализа
### Playwright policy
Playwright допускается для источников, где:
- критическая логика формируется на клиенте
- прямой HTTP scraping недостаточен
- требуется JS rendering или пользовательская навигация
При этом Playwright считается более хрупкой интеграционной точкой по сравнению с HTTP/API клиентами.
Для Playwright-based интеграций принимаются дополнительные ограничения:
- сценарий навигации должен быть максимально коротким
- DOM-селекторы должны быть минимально хрупкими
- логика парсинга должна быть отделена от логики браузерной навигации
- fallback или быстрая диагностика деградации обязательны
### Resilience policy
При изменении внешнего источника система должна:
- завершать конкретную задачу контролируемой ошибкой
- не повреждать уже сохранённые данные
- не маскировать сбой как успешную синхронизацию
- сохранять возможность повторного запуска после исправления
### Ownership policy
Каждая интеграция с внешним источником должна иметь:
- понятную точку входа
- понятный набор задач
- понятный формат выходных данных
- наблюдаемый статус выполнения
## Consequences
### Positive
- уменьшается связность между интеграциями
- упрощается ремонт конкретного источника
- проще локализовать причину отказа
- снижается риск каскадного повреждения всей системы
- повышается операционная предсказуемость
### Negative
- возрастает количество прикладного кода и адаптеров
- приходится поддерживать отдельные контракты на источник
- растут требования к логированию и smoke-проверкам
- интеграции невозможно считать "написал один раз и забыл"
## Alternatives considered
### 1. Общий универсальный парсер для разных источников
Отклонено, так как источники сильно отличаются по протоколу, структуре и стабильности.
### 2. Встраивание логики источников прямо в задачи или view-слой
Отклонено, так как это увеличивает связность и ухудшает сопровождаемость.
### 3. Опора только на "ручное замечание", что парсер сломался
Отклонено, так как это не соответствует требованиям эксплуатационной зрелости.
## Notes
Следующим развитием данного решения должны быть:
- smoke checks для критичных источников
- классификация типов ошибок интеграции
- runbook для восстановления парсеров после изменения внешних порталов