Главная / Проекты / Интеграционный слой для JTI
Интеграции Высоконагруженные системы CDC FMCG

Интеграционный слой для BI, DWH и смежных систем

SFA-система JTI «Ева» — источник данных для аналитики, хранилища данных, расчёта выплат торговым точкам и распознавания выкладки. GROTEM построил и три года развивает интеграционный слой, который отдаёт эти данные быстро, согласованно и по требованиям службы безопасности — от ночных выгрузок до обновления по событиям.

  • 40+ млн строк — в таблицах, которые смежные системы забирают через API
  • С 4 часов до 20 минут — сократилось формирование тяжёлого снапшота после технического релиза
  • CPU с 250% до 140% — после объединения дублирующих снапшотов
  • В 4 раза чаще — могут обновляться данные по контрактам: раз в 6 часов вместо раза в сутки
Схема интеграционного слоя «Евы»
Клиент
Отрасль FMCG, табачная промышленность
масштаб 6–8 смежных систем, более 100 снапшотов данных
география Вся Россия
решение Интеграционный сервис SFA-системы «Ева», развитие с 2023 года
01
Контекст

Клиент и исходная ситуация

JTI Россия — лидер табачного рынка страны. С 2024 года её полевая команда работает в SFA-системе «Ева», которую GROTEM создал на замену Oracle Siebel.

Данные «Евы» — точки, контракты, результаты аудита, сотрудники — нужны целому контуру систем JTI. Их разрабатывают разные команды, и каждой нужен свой набор данных.

Потребители данныхBI, хранилище данных, система расчёта вознаграждений, распознавание выкладки и другие — всего 6–8 систем
Что получаютТочки, контракты, результаты аудита, сотрудники
ОбъёмБолее 100 снапшотов, таблицы до 40–50 млн строк
ГеографияВся Россия

Что происходило до начала проекта

  • Служба безопасности JTI запретила простой вариант — реплики баз данных через VPN. Данные можно было отдавать только через API с аутентификацией и авторизацией.
  • Первая версия API для BI замедлялась на каждой следующей странице. Выгрузка больших таблиц растягивалась примерно на сутки и не успевала до следующего обновления — интеграция фактически не работала.
  • Для каждой системы делался отдельный снапшот, хотя данные во многом совпадали. Сервис упирался в процессор и память.
  • Снапшоты обновлялись раз в сутки, тяжёлые собирались от 2 до 10 часов. Смежные системы видели данные возрастом до 24 часов, а бизнесу нужно было чаще.
02
Цели и задачи

Каких результатов хотел достичь клиент

Цель проекта

Отдавать данные «Евы» смежным системам JTI быстро, согласованно и безопасно — и приблизить их актуальность к реальному времени.

01

Выполнить требования безопасности

Выдавать данные только через защищённый API, без прямого доступа к базам.

02

Гарантировать целостность выгрузки

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

03

Снизить нагрузку на инфраструктуру

Перестать дублировать одни и те же данные для разных потребителей.

04

Обновлять данные чаще раза в сутки

Доставлять изменения потребителям за часы, а не за сутки, и платить ресурсами только за реально изменившиеся данные.

05

Не сломать действующие интеграции

Менять механизм так, чтобы текущие потребители не заметили изменений.

03
Решение

Что разработала команда GROTEM

Отдельный сервис интеграции со своей базой собирает данные из сервисов «Евы» в готовые витрины — снапшоты — и отдаёт их по защищённому API. За три года мы прошли путь от ночных выгрузок до обновления по событиям.

Схема: постраничная выдача снапшота
API для больших таблиц

Выгрузка десятков миллионов строк без замедления

Новый API отдаёт страницы с одинаковой скоростью — и первую, и последнюю. Каждый ответ содержит зашифрованный токен следующей страницы, поэтому внешней системе не нужно знать, как устроена выборка:

  • выдача только изменений с указанной даты;
  • токен привязан к конкретному снапшоту и действует сутки;
  • выгрузка остаётся целостной, даже если посреди неё вышла новая версия данных;
  • документация для внешних команд JTI написана до старта разработки.
  • API
  • Высоконагруженные системы
  • BI
Схема: сервисы снапшотов, импорта-экспорта и фоновых задач
Оптимизация снапшотов

Общие снапшоты и сервисы по зонам ответственности

Дублирующиеся снапшоты для разных систем объединили в общие. Сервис интеграции разделили на три: снапшоты, импорт и экспорт файлов, внутренние задачи по расписанию. У каждого теперь своя очередь задач, и тяжёлая выгрузка не блокирует остальные.

  • Производительность
  • Микросервисы
Обновление по событиям

Данные по контрактам — ближе к реальному времени

Вместо суточного пересчёта всего снапшота система ловит изменения в 15 исходных таблицах и пересчитывает только затронутые контракты. Механизм реализован для снапшота контрактов: новая версия обновляется минимум раз в 6 часов, а архитектура позволяет дойти до минут. Старая версия работает как раньше, а переход на новую стоит потребителю смены имени снапшота.

  • CDC
  • Debezium
  • Kafka
04
Сложность

Особенности проекта

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

01
Только API, никаких реплик

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

02
Потребителей разрабатывают другие подрядчики

Каждое изменение на стороне BI и DWH проходит долгое согласование. API должен был работать правильно даже при ошибках на стороне клиента и не требовать от него знания внутреннего устройства.

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

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

04
Контракт собирается из многих источников

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

05
Риск ложных удалений

Стандартная логика считает удалённым всё, чего не было в текущем прогоне. При частичном обновлении это стёрло бы почти все контракты у потребителей.

05
Инженерная часть

Что было важно реализовать на уровне системы

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

Keyset-пагинацияВместо пропуска строк через OFFSET запрос берёт строки после последнего полученного ключа. Индекс работает во всех случаях, включая инкрементальную выгрузку.
Зашифрованный токен страницыAES-токен хранит тип снапшота, версию данных и срок жизни. Токен от другого снапшота или вчерашний токен получит понятную ошибку.
Отдельный кластер для больших таблицСнапшоты переехали на PostgreSQL 17, а разовое обслуживание таблиц освободило диск и ускорило формирование.
CDC в две фазыDebezium передаёт изменения в Kafka, один консьюмер читает 15 топиков и записывает в буфер только ID затронутых контрактов. Вторая фаза обогащает их пачками по 1 000 и публикует новую версию.
Декларативная карта источниковНовая таблица-источник добавляется несколькими строками. Затронутые контракты ищутся одним запросом на топик, а не отдельными запросами по каждому событию (раньше — до 20 000 запросов на 10 000 событий).
Гарантия доставкиПозиция в Kafka фиксируется только после записи в буфер, а буфер очищается только после публикации версии. Где бы ни произошёл сбой, данные сойдутся.
СтраховкиУдаления только в рамках изменившихся контрактов, смена даты как отдельное событие, полный пересчёт раз в неделю и мониторинг глубины буфера.
06
Результаты

Что получил бизнес

Смежные системы JTI получают данные «Евы» быстрее и свежее: формирование тяжёлого снапшота сократилось примерно с 4 часов до 20 минут, а данные по контрактам могут обновляться в 4 раза чаще.

20 минут

вместо 4 часов — на сборку тяжёлого снапшота после технического релиза

140% CPU

вместо 250% — у сервиса интеграции после объединения снапшотов

6 часов

цикл обновления данных по контрактам вместо раза в сутки

40+ млн

строк в таблицах, которые выгружаются без деградации скорости

Процесс
До проекта
После запуска
Выгрузка больших таблиц в BI
Около суток, не успевала до следующего снапшота
Стабильная скорость на любой странице
Согласованность выгрузки
Не гарантировалась при смене версии
Версия данных зафиксирована в токене
Актуальность данных по контрактам
До 24 часов
Цикл 6 часов с запасом до минут
Стоимость обновления
Полный пересчёт при любой правке
Пропорциональна объёму изменений
Очередь фоновых задач
Одна на все, время от времени забивалась
Своя у каждого сервиса
  • Смежные системы — аналитика, расчёт выплат, распознавание — могут получать данные по контрактам в 4 раза чаще: достаточно перейти на новую версию снапшота.
  • Механизм CDC универсален: чтобы перевести на него следующий снапшот, достаточно описать карту источников и добавить две задачи.
07
Стек

Технологии проекта

Архитектура

Микросервисы Отдельные сервисы интеграции, импорта-экспорта и фоновых задач

Бэкенд

.NET Entity Framework Core Npgsql Hangfire

База данных

PostgreSQL 17

Потоковая обработка данных

Debezium Apache Kafka

Инфраструктура

Kubernetes Yandex Cloud

Мониторинг

Grafana Prometheus
Обсудим ваш проект

Поможем выбрать оптимальное решение для вашего бизнеса

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

  • Покажем релевантный опыт на похожих проектах
  • Сформируем решение с учётом ваших задач и IT-ландшафта
  • Предложим следующие шаги без обязательств

Оставьте заявку на консультацию

Заполните обязательные поля — остальное обсудим в разговоре. Перезвоним или напишем в течение одного рабочего дня

Бесплатно Ответ за 1 рабочий день Без обязательств

Спасибо! Данные отправлены.

Для подписки на рассылку подтвердите почту по ссылке в письме. Если письма нет, проверьте папки «Спам» и «Промоакции».