Виталий Кравцов
AI-разработкаАвтоматизацияИнтеграция

Автоматическая синхронизация данных Tripster для travel-продукта

Для туристических витрин, агрегаторов, аналитических и внутренних travel-систем.

Сервис автоматически собирает и актуализирует экскурсии, гидов, расписания и отзывы из партнёрского API, не повторяя полную загрузку при каждом обновлении.

Хочу так же
01

Контекст

Travel-продукту нужны не отдельные выгрузки, а собственная рабочая база: экскурсии, гиды, города, расписания и отзывы должны быть связаны между собой и регулярно обновляться. Эти данные используются в витринах, фильтрах, аналитике и внутренних процессах.

Полная перезагрузка при каждом обновлении создаёт тысячи лишних запросов, увеличивает время синхронизации и быстрее упирается в ограничения партнёрского API. При этом сбой на одном типе данных не должен заставлять начинать весь процесс заново.

02

Бизнес-задача

Нужно было построить управляемый сервис автоматического сбора и актуализации данных Tripster в PostgreSQL. Он должен поддерживать большой объём записей, продолжать работу после частичных сбоев и показывать, какие данные ещё ждут обновления.

  • Первично собрать связанные справочники и контент.
  • Обновлять только изменившиеся сущности.
  • Не терять задачи при ограничениях API и остановках.
  • Контролировать расхождения между источником и базой.
  • Оставить критические решения и live-запуски человеку.
03

Что было реализовано

Создан Python CLI-сервис, который получает данные из партнёрского API, валидирует ответы через Pydantic, нормализует различающиеся форматы и сохраняет сущности в PostgreSQL через SQLAlchemy. Отдельные команды покрывают первичную загрузку, инкрементальные обновления, обработку очереди, проверку расхождений и обновление расписаний.

Основной рабочий режим — не повторная полная выгрузка, а инкрементальный цикл. Сервис хранит курсоры, находит изменившиеся экскурсии и ставит связанные расписания и отзывы в устойчивую очередь. Reconcile-проход проверяет лёгкие списочные данные и добавляет в очередь то, что могло разойтись.

  • Страны, города, гиды, экскурсии, расписания и отзывы в связанной схеме.
  • Full, incremental, reconcile и backlog-команды для разных режимов работы.
  • Курсоры обновления и журнал запусков.
  • Повторяемые upsert-операции вместо дублирования записей.
  • Равномерный темп запросов, обработка 429 и пауза перед продолжением.
  • Проверка целостности и ограниченные live-аудиты перед рабочими запусками.
04

Как решения помогают бизнесу

РешениеЗадачаПольза
Инкрементальная синхронизацияНе повторяет полную выгрузку ради небольших изменений.Меньше запросов и короче регулярный цикл обновления.
Курсоры по типам данныхФиксируют подтверждённую точку продолжения.Следующий запуск продолжает работу с понятного состояния.
Устойчивая backlog-очередьСохраняет связанные задачи на расписания и отзывы.Большой объём обрабатывается управляемыми пакетами.
Reconcile-проверкаНаходит расхождения без массовых detail-запросов.База актуализируется экономнее и предсказуемее.
Валидация и нормализацияПриводит разные ответы API к устойчивой модели.Ошибки формата обнаруживаются до записи в рабочие таблицы.
Идемпотентные upsert-операцииОбновляют существующие записи по стабильным ключам.Повторный запуск не размножает сущности.
Контроль темпа и 429Не допускает резких всплесков запросов и корректно реагирует на лимиты.Синхронизация бережнее работает с партнёрским API.
Human-in-the-Loop процессОтделяет AI-генерацию от решений с операционным риском.Архитектура, live-аудиты и рабочие запуски проходят человеческую проверку.
05

Почему выбрана такая архитектура

Контур актуализации travel-данных

Автоматика поддерживает рабочую базу, а человек контролирует архитектуру, live-проверки и запуск изменений.

  1. Партнёрский API
  2. Проверка и нормализация
  3. PostgreSQL
  4. Incremental, backlog и reconcile
  • Актуальная рабочая база
  • Human-in-the-Loop контроль

Полная синхронизация — стартовый и аварийный режим

Полный проход нужен для первичного наполнения или контролируемого восстановления. Регулярная актуализация строится на incremental, backlog и reconcile, чтобы не создавать тысячи повторных запросов.

Очередь отделяет обнаружение изменений от тяжёлых обновлений

Изменившаяся экскурсия быстро попадает в базу, а связанные расписания и отзывы обновляются пакетами. Размер пакета можно согласовать с доступным окном и лимитами API.

Reconcile закрывает разрывы между курсорами и источником

Лёгкий списочный проход сравнивает состояние источника с базой и ставит отличающиеся записи в очередь. Это страховка от пропущенных изменений без постоянной полной выгрузки.

Ограничения источника учитываются явно

Live-аудит показал, что фильтр обновления для справочника гидов нельзя считать надёжным. Поэтому сервис не обещает ложный incremental для этого раздела: режим его обновления выбирается отдельно и проверяется контролируемыми запусками.

AI создаёт, человек отвечает за выпуск изменений

Весь код и документация проекта сгенерированы AI. Human-in-the-Loop оставляет ответственность у человека: он формулирует требования, проверяет архитектуру и код, запускает ограниченные live-аудиты, разбирает инциденты и подтверждает изменения перед рабочими синхронизациями.

06

Результат

В рабочей базе собрано 30 503 экскурсии, 8 516 гидов, 30 189 расписаний и 953 868 отзывов. Дополнительно связаны 123 страны и 937 городов. Это не демонстрационная выборка, а объём, на котором проверялись схема, upsert-операции и процесс обновления.

Регулярный процесс обновляет изменившиеся экскурсии, сохраняет связанные задачи в backlog и отдельными пакетами актуализирует расписания и отзывы. Reconcile помогает обнаружить расхождения, а журнал запусков и курсоры делают состояние процесса проверяемым.

Актуальность зависит от расписания запусков и скорости обработки backlog — это не обещание real-time. Часть редко используемых полей сохраняется в raw_data, а изменения схемы сейчас выполняются через ensure_schema, без Alembic-миграций. Эти ограничения зафиксированы и учитываются при эксплуатации.

Где это применимо

Подход подходит продуктам, которым нужен собственный актуализируемый слой данных поверх внешнего каталога.

  • Туристические витрины и каталоги экскурсий.
  • Агрегаторы предложений из нескольких источников.
  • Региональные и тематические travel-проекты.
  • Внутренняя аналитика контента, гидов и отзывов.
  • Подготовка данных для поиска и рекомендаций.
  • Интеграционные слои для CRM и back-office систем.

Вывод

Главный результат проекта — не разовая выгрузка, а управляемая актуализация большого travel-каталога. Инкрементальные проходы, backlog и reconcile снижают нагрузку на источник и позволяют видеть незавершённую работу.

AI ускорил создание всего кода и документации, но не получил право самостоятельно принимать рискованные решения. Human-in-the-Loop связал скорость генерации с инженерной проверкой и ответственным запуском.

Следующий шаг

Хочу так же

Опишите задачу. Я посмотрю контекст и предложу, с чего лучше начать.

Данные используются только для ответа на обращение