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

6.9 KiB
Raw Blame History

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 для восстановления парсеров после изменения внешних порталов